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?

Foi útil?

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

Ver ViewModel, Model-View-ViewModel.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top