2010-01-18 8 views
6

Actualmente estoy implementando una solución de paginación del lado del cliente usando ASP.NET, jQuery y JSON.ASP.NET, C# y tipos anónimos - Iterar a través de una DataTable mientras se construye manualmente un tipo anónimo

He estado siguiendo el excelente artículo de encosia: http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/

En mi método Web puedo recuperar mis datos de la base de datos como un DataTable:

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

luego recuperar los datos de la DataTable en un tipo anónimo:

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

el tipo anónimo se devuelve desde el método web para el lado del cliente:

return feeds.Take (PageSize);

Una plantilla continuación, extrae y muestra los campos:

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

Todo esto funciona muy bien.

Sin embargo, me gustaría extender el código para realizar algunas comprobaciones de evaluación (por ejemplo, comprobar que varias columnas en DataTable no son NULAS) y otro preprocesamiento (por ejemplo, invocar varias funciones para construir la URL de la imagen el ID de la imagen, que es otra columna del DataTable que no se muestra en el fragmento de código, antes de devolver las filas resultantes del DataTable como un tipo anónimo al lado del cliente.

Básicamente, quiero iterar a través de la DataTable, realizar comprobaciones de evaluación y preprocesamiento, mientras construyo mi tipo anónimo manualmente a medida que avanzo. ¿O tal vez hay una mejor manera de lograr esto?

¿De todos modos puedo lograrlo?

Saludos cordiales

Walter

Respuesta

2

Creo que la comprobación de nulos es probablemente algo que tiene sentido en el lado del servidor. El enfoque que describe Douglas es uno viable. Otra es la de manejar el tema nulo como usted está construyendo la colección de tipos anónimos:

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 tiene un buen puesto en using the null coalescing operator to handle nulls concisely, como se muestra arriba.

En cuanto a la construcción de enlaces, eso es algo que probablemente sugeriría hacer en la plantilla del lado del cliente. Puede eliminar bastantes datos redundantes enviados en el JSON de esa manera.Algo como esto, por ejemplo:

<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

A veces me resulta útil usar la palabra clave "dejar" el uso de LINQ para almacenar el valor que necesito para usar más tarde en la consulta. Puedo utilizar esta variable más adelante para verificaciones nulas simples u otras cosas. Por ejemplo:

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

La única otra cosa que puedo pensar si es demasiado simple realizar su pre-procesamiento en el DataTable antes de llamar al LINQ consulta.

Espero que esto ayude.

Cuestiones relacionadas