ASP.Net Core: ViewComponent vs EditorTemplate / DisplayTemplate vs @inject

10

Então, eu estava procurando uma boa maneira no ASP.Net Core para criar alguns "controles" que se transformam em uma exibição. Até agora, descobri que há três opções e gostaria de obter algum feedback sobre elas.

  1. ViewComponents: são como mini controladores e usam métodos como ações para renderizar a partir de uma página de navalha (exibição). Eu acredito que eles podem ter uma lógica independente, portanto não há dependência de nenhum modelo de exibição pai.

  2. Pastas EditorTemplate / DisplayTemplate: elas existem em "Views / Shared /" e podem ser acessadas em uma visualização passando uma propriedade de modelo para elas (usando DisplayFor()ou EditorFor()).

  3. @ Injetar para o ASP.Net Core: Permite injetar um tipo em uma exibição (não faço idéia se uma exibição parcial pode ser associada?).

  4. Estou deixando de fora a capacidade de incluir visualizações parciais diretamente, pois não é minha intenção o sistema de controle que estou examinando.

  5. Auxiliar de etiqueta - é possível injetar o contexto de exibição atual e criar controles a partir deles também.

Em um aplicativo ASP.NET MVC mais antigo, eu tinha alguns controles renderizados a partir dos modelos (# 2). No entanto, para o .Net Core, estou pensando em possivelmente usar ViewComponents (que parecem mais poderosos) para renderizar visualizações de barbear associadas (os controles basicamente envolvem apenas visualizações de barbear). No momento, vou experimentar a conversão para ViewComponents, mas gostaria de alguns conselhos sobre o assunto, obrigado.

James Wilkins
fonte

Respostas:

2

Use ViewComponent se você tiver alguma lógica de negócios para executar. Ele suporta o princípio de Separação de Preocupações (SoC). Você pode injetar parâmetros na classe ViewComponent da view (use o arquivo .cshtml do razor). As visualizações ViewComponent podem ser encontradas em Views / Shared / Components . Pode ser fortemente tipado. O ViewComponent usa chamadas de método assíncronas, para que os usuários não precisem esperar o carregamento de todo o conteúdo de uma página inteira. Além disso, o ViewComponent pode ser chamado como auxiliar de tag: você precisa adicionar seu ViewCompenent como auxiliar de tag usando a diretiva @addTagHelpers. Esse recurso oferece suporte ao editor de desenvolvedor no modelo do editor de barbear.

Use o Editor / Modelo de exibição ao editar ou exibir certos tipos ou classes. Por exemplo, você deseja especificar que o objeto Produto deve aparecer com a tabela de especificações. Ele preserva o princípio DRY em seu aplicativo MVC. Ele pode ser usado como vista parcial, que é um modelo vinculado ao objeto que deseja exibir.

Marcin C
fonte
0

Minha abordagem é a seguinte ...

  1. Use o ViewComponent para encapsular a lógica de negócios de como recuperar os modelos a serem exibidos
  2. Se a visualização de destino for simples e / ou única, coloque o html aqui diretamente, caso contrário, use um DisplayTemplate para renderizar o modelo

A justificativa é que ainda tenho separação de preocupações entre a lógica de negócios e a renderização.

Como exemplo prático, considere algo como uma estrutura de menu específica do contexto; o ViewComponent pode determinar quais menus exibir e o DisplayTemplate pode renderizar cada um.

Paul Hatcher
fonte
Tenha cuidado ao usá-los para carregar dados. Um funcionário meu fez isso e, mais tarde, quando desejamos criar uma API REST para AJAX (por exemplo, se alguém quisesse usar o Angular), a lógica estava na API e NÃO nos componentes. ;) Se não estiver usando uma API REST para o seu site (que é comum hoje em dia), os componentes serão melhor utilizados para renderizar apenas passando dados a eles por ações do controlador e retornando o resultado. No final, decidi usar os Auxiliares de tags com um contexto de ação injetado para criar meus controles como tags nas visualizações. Parece muito mais limpo no final. ;)
James Wilkins
Injeto o serviço api no ViewComponent para realmente adquirir os dados - se precisarmos da mesma lógica retornando o html de destino, por exemplo, para usar o ajax para atualizar o componente, expô-lo-á através de um método controlador.
Paul Hatcher