Pregunta

tengo un jQuery Tabla de datos configurado para el procesamiento del lado del servidor contra un servidor ASP.NET MVC.

Para lograr una mejora progresiva, se representa una tabla HTML y luego se actualiza a DataTable.Cuando DataTable realiza una llamada AJAX para recuperar más datos, espera que los elementos del JSON devuelto se correlacionen con el diseño de columnas de tabla existente.

Este parece causar cierta fricción arquitectónica, porque:

Durante la representación de la página inicial:

  • El Controlador transforma los datos de la base de datos en DTO y establece un modelo ViewData.
  • ViewPage transforma el modelo ViewData en HTML con la ayuda de HtmlHelper, etc.

Durante las actualizaciones de AJAX:

  • El Controlador transforma los datos de la base de datos en datos de celdas de tabla, con hipervínculos, etc.
  • DataTable representa los datos devueltos directamente en las celdas de la tabla.

El punto aquí es que el Controlador ahora se ve obligado a conocer el diseño de representación de la tabla, cuando es responsabilidad debería limitarse a devolver DTO.

cual es el correcto patrón aquí?¿Cómo admito llamadas AJAX y cumplo con el principio de responsabilidad única en el controlador?


Un poco de claridad:

Mi DTO tiene tres propiedades:

public class AccountListing
{
    public int Id { get; set; }
    public string AccountCode { get; set; }
    public string AccountName { get; set; }
}

El DataTable renderizado tiene cuatro columnas:

+--------------+--------------+------+------+
| Account Code | Account Name | View | Edit |
+--------------+--------------+------+------+
| 12345        | FooBar Inc.  | Link | Link |
+--------------+--------------+------+------+

ViewPage representa el DTO de 3 propiedades en una tabla de 4 columnas.Si el controlador devuelve el mismo DTO de 3 propiedades que AJAX JSON, la tabla de datos se queja de que faltan columnas...la tabla de datos espera que el JSON devuelto represente elementos de celda, a diferencia de los datos de origen.

Actualmente estoy resolviendo esto usando transformaciones de matriz jQuery y representación de tablas personalizadas, lo que efectivamente duplica la lógica de ViewPage.

¿Hay alguna alternativa?

¿Fue útil?

Solución

Su solución actual (haciendo la prestación del lado del cliente) sonido bueno para mí.

La cosa es que sus dtos no tiene que corresponder a lo que muestra la lista de páginas de vista. El patrón popular es tener objetos modelo de vista para estas situaciones.

Por ejemplo:

public class AccountListingViewModel {
    public string AccountCode { get; set; }
    public string AccountName { get; set; }
    public string ViewLink { get; set; }
    public string EditLink { get; set; }
    public static AccountListingViewModel FromAccountListing(AccountListing o) {
        AccountListingViewModel returnObj = new AccountListingViewModel();
        //populate the properties from the parameter
        return returnObj;
    }
}

Ver [viewmodel] , [modelo-vista-viewmodel] .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top