Qual é o padrão AJAX correto para usar o JQuery Datatable com o ASP.NET MVC?
-
25-09-2019 - |
Pergunta
Eu tenho um jQuery Tabela de dados Configurado para processamento do lado do servidor em um servidor MVC ASP.NET.
Para obter aprimoramento progressivo, uma tabela HTML é renderizada e depois atualizada para um Datatable. Quando o DataTable faz uma chamada AJAX para recuperar mais dados, espera que os elementos do JSON retornado se correlacionem com o layout da coluna de mesa existente.
este parece para causar algum atrito arquitetônico, porque:
Durante a renderização inicial da página:
- O controlador transforma os dados do banco de dados em DTOs e estabelece um modelo ViewData.
- A ViewPage transforma o modelo ViewData em HTML com a ajuda de Htmlhelper, etc.
Duriung Ajax Atualizações:
- O controlador transforma os dados do banco de dados em dados de células de tabela, com hiperlinks, etc.
- O DataTable renderiza os dados retornados diretamente nas células da tabela.
O ponto aqui é que o controlador agora é forçado a saber sobre o layout de renderização da tabela, quando é responsabilidade deve Limitar -se a passar os DTOs de volta.
Qual é o correto padrão aqui? Como apoio as chamadas do AJAX e adendo ao diretor de responsabilidade única no controlador?
Alguma clareza:
Meu DTO tem três propriedades:
public class AccountListing
{
public int Id { get; set; }
public string AccountCode { get; set; }
public string AccountName { get; set; }
}
O Datatable renderizado possui quatro colunas:
+--------------+--------------+------+------+
| Account Code | Account Name | View | Edit |
+--------------+--------------+------+------+
| 12345 | FooBar Inc. | Link | Link |
+--------------+--------------+------+------+
A ViewPage renderiza a propriedade DTO em uma tabela de 4 colunas. Se o controlador passar de volta a mesma propriedade DTO do AJAX JSON, a tabela de dados reclama das colunas ausentes ... A tabela de dados espera que o JSON retornado represente elementos da célula, em oposição aos dados de origem.
Atualmente, estou resolvendo isso usando transformações de JQuery e renderização de tabela personalizada, que duplica efetivamente a lógica da página de exibição.
Existe alguma alternativa?
Solução
Sua solução atual (fazer a renderização no lado do cliente) parece boa para mim.
O problema é que seus DTOs não precisam corresponder ao que as páginas de exibição exibem. O padrão popular é ter objetos de viewmodel para essas situações.
Por exemplo :
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;
}
}