2010-01-18 11 views
6

Obecnie wdrażam rozwiązanie stronicowania po stronie klienta przy użyciu programów ASP.NET, jQuery i JSON.ASP.NET, C# i typy anonimowe - Iterowanie za pomocą DataTable przy ręcznym budowaniu anonimowego typu

śledzę doskonałej artykule z encosia: http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/

W moim metoda Web odzyskać moje dane z bazy danych jako DataTable:

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

I następnie pobrać dane z DataTable do typ anonimowy:

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

typ anonimowy następnie wrócił z metodą internetowy stronie klienta:

powrót feeds.Take (PageSize);

Szablon następnie wyodrębnia i wyświetla pola:

<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> 

To wszystko działa świetnie.

Chciałbym jednak rozszerzyć kod, aby przeprowadzić pewne kontrole ewaluacyjne (np. Sprawdzić, czy różne kolumny w DataTable nie są NULL) i inne przetwarzanie wstępne (np. Wywołać różne funkcje do budowania adresu URL obrazu na podstawie identyfikator obrazu - który jest inną kolumną w tabeli DataTable, której nie widać w fragmencie kodu), zanim zwrócę wynikowe wiersze tabeli DataTable jako typ anonimowy po stronie klienta.

Zasadniczo chcę iterować poprzez DataTable, przeprowadzać kontrole oceny i wstępne przetwarzanie, jednocześnie budując mój anonimowy typ ręcznie, gdy jestem. A może jest lepszy sposób na osiągnięcie tego?

Czy mimo to mogę to osiągnąć?

poważaniem

Walter

Odpowiedz

2

Myślę, że sprawdzanie wartości zerowych jest prawdopodobnie czymś, co ma sens po stronie serwera. Podejście, które opisuje Douglas, jest jednym z możliwych do zastosowania. Innym jest obsłużyć zerowy problem jak ty budynek zbierania anonimowych typów:

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 ma dobrą post using the null coalescing operator to handle nulls concisely, jak pokazano powyżej.

Jeśli chodzi o tworzenie linków, jest to coś, co prawdopodobnie bym zasugerował w szablonie po stronie klienta. W ten sposób można wyeliminować całkiem sporo zbędnych danych wysłanych w JSON.Coś takiego, na przykład:

<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

Czasami uważam, że warto korzystać z „niech” słowa kluczowego przy użyciu LINQ do przechowywania wartości Ptrzebuję później użyć w zapytaniu. Mogę użyć tej zmiennej później do prostych kontroli zerowych lub innych rzeczy. Na przykład:

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 
     }; 

Jedyne co mogę myśleć, jeśli jest zbyt prosty wykonywać swoją wstępną obróbkę na DataTable przed wywołaniem kwerendy LINQ.

Mam nadzieję, że to pomoże.

Powiązane problemy