2010-01-18 6 views
6

Ich implementiere derzeit eine clientseitige Paging-Lösung mit ASP.NET, jQuery und JSON.ASP.NET, C# und anonyme Typen - Iterate durch eine DataTable beim manuellen Erstellen eines anonymen Typs

Ich habe nach dem ausgezeichneten Artikel von encosia gewesen: http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/

In meiner Web-Methode ich meine Daten aus der Datenbank als Datentabelle abrufen:

DataTable categoryProducts = ProductViewerAccess.GetCategoryProducts 
     ("AA", 4, 0, Page.ToString(), out howManyPages, "FALSE", 0, "CostPrice", "asc", destinationList); 

ich abrufen dann die Daten aus der Datentabelle in ein anonymer Typ:

var feeds = 
     from feed in categoryProducts.AsEnumerable() 
     select new 
     { 
      Description = feed.Field<string>("description"), 
      MfPartNo = feed.Field<string>("MfPN"), 
      Inventory = feed.Field<Int32>("Inventory") 
     }; 

der anonyme Typ wird dann von der Web-Methode auf die Client-Seite zurückgegeben:

Rückführungen.Aufnehmen (PageSize);

Eine Vorlage extrahiert dann und zeigt die Felder:

<tbody> 
    {#foreach $T.d as post} 
    <tr> 
     <td> 
     {$T.post.Description} 
     <p>Mfr#: {$T.post.MfPartNo}</p> 
     </td> 
     <td>{$T.post.Inventory}</td> 
    </tr> 
    {#/for} 
    </tbody> 

Das alles funktioniert super.

Ich möchte jedoch den Code erweitern, um einige Auswertungsüberprüfungen durchzuführen (z. B. prüfen, dass verschiedene Spalten in der DataTable nicht NULL sind) und andere Vorverarbeitung (z. B. Aufruf verschiedener Funktionen zum Erstellen der Bild-URL basierend auf Die Image-ID - die eine andere Spalte in der DataTable ist, die nicht im Codefragment angezeigt wird -, bevor die resultierenden Zeilen der DataTable als anonymer Typ an die Clientseite zurückgegeben werden.

Grundsätzlich möchte ich die DataTable durchlaufen, führen Sie die Evaluierungsüberprüfungen und Vorverarbeitung, während ich meinen anonymen Typ manuell erstellen, wie ich gehe. Oder vielleicht gibt es einen besseren Weg, dies zu erreichen?

Kann ich das irgendwie erreichen?

Mit freundlichen Grüßen

Walter

Antwort

2

Ich denke, dass die Überprüfung auf Nullen ist wahrscheinlich etwas, das auf der Serverseite sinnvoll ist. Der von Douglas beschriebene Ansatz ist ein praktikabler Ansatz. Ein weiterer Grund ist das Null-Problem zu behandeln, wie Sie die Sammlung von anonymen Typen Gebäude sind:

var feeds = 
    from feed in categoryProducts.AsEnumerable() 
    select new 
    { 
     Description = feed.Field<string>("description"), 
     MfPartNo = feed.Field<string>("MfPN"), 
     // Return 0 if the inventory value is null. 
     Inventory = (int?)feed.Field("Inventory") ?? 0 
    }; 

ScottGu hat einen guten Beitrag am using the null coalescing operator to handle nulls concisely, wie oben gezeigt.

Wie zum Erstellen der Links, würde ich wahrscheinlich vorschlagen, in der clientseitigen Vorlage zu tun. Sie können auf diese Weise ziemlich viele redundante Daten eliminieren, die im JSON gesendet werden.So etwas wie zum Beispiel:

<tbody> 
    {#foreach $T.d as post} 
    <tr> 
    <td> 
     <a href="/url/to/details.aspx?id={$T.post.ID}">{$T.post.Description}</a> 
     <p>Mfr#: {$T.post.MfPartNo}</p> 
    </td> 
    <td>{$T.post.Inventory}</td> 
    </tr> 
    {#/for} 
</tbody> 
1

Manchmal finde ich es hilfreich, die „let“ keyword mit LINQ zu verwenden Wert speichern Ich muss später in der Abfrage verwenden. Ich kann diese Variable später für einfache Nullprüfungen oder andere Dinge verwenden. Zum Beispiel:

var feeds = 
    from feed in categoryProducts.AsEnumerable() 
    let MfPN = feed.Field<string>("MfPN") 
    // Get image url if MfPN is not null, else return default image url. 
    let Url = !string.IsNullOrEmpty(MfPN) ? GetImgUrl(MfPN) : “DefaultImage.jpg” 
     select new 
     { 
      Description = feed.Field<string>("description"), 
      MfPartNo = MfPN, 
      Inventory = feed.Field<Int32>("Inventory"), 
      ImageUrl = Url 
     }; 

Das einzige, was ich denken kann, wenn zu einfach Ihre Vorbearbeitung auf dem Datatable durchführen, bevor die LINQ-Abfrage aufrufen.

Hoffe, das hilft.

Verwandte Themen