Digamos que estou escrevendo um aplicativo da web de blog usando o padrão MVC. O layout típico da página principal do aplicativo de blog é - algum tipo de índice de postagem na parte principal e, além disso, existem algumas partes adicionais, como linha do tempo, painel de navegação de tags, painel de inscrição etc. Esses controles também aparecem em um único pós-visualização e pode aparecer em outras visualizações que possuo.
Minha pergunta é - como devo lidar com esses painéis de lado nas minhas visualizações e controladores. Eu vejo três abordagens aqui:
Crie uma grande classe de modelo de exibição que contenha todas as informações necessárias para renderizar as exibições (índice ou postagem única). Nesse caso, eu poderia transformar esses painéis de lado em visualizações parciais e chamá-los da visualização sendo renderizados como parte desse grande modelo de visualização. A desvantagem é - terei o viewmodel de preenchimento de código espalhado entre vários métodos de controlador, o que significa que o código é duplicado. O que é muito ruim.
Crie outra camada de exibição de renderização. Digamos, a camada superior de renderização recebe uma parte já renderizada de html, ou funções que, quando chamadas, produzem um html. A camada abaixo desta "combinação de camadas parciais" daria apenas visualizações parciais para cada painel que eu desejar, incluindo o conteúdo principal. A desvantagem aqui - uso de memória. A maioria das estruturas modernas processa htmls diretamente no fluxo de saída, mas nessa abordagem as visualizações parciais seriam renderizadas primeiro em objetos de string - o que leva à sobrecarga da memória.
- Use algo como "RenderAction" do asp.net mvc, que chama um método de controlador de uma exibição. Eu acho que esta é a pior solução de 3 dada, porque deixa cair uma abordagem MVC.
A questão não está vinculada a nenhuma estrutura específica, quero entender a maneira geral de fazer coisas assim.
ATUALIZAR
Depois de uma resposta dada, descobri que o post não está claro. Atualização tão razoável aqui:
No termo viewmodel, eu entendo um objeto que contém todos os dados necessários para renderizar uma exibição específica.
Todas as três abordagens envolvem a construção de vistas parciais com seu próprio modelo de vista. Por exemplo (usando a sintaxe C #):
class SinglePostViewModel {
string Text {get;set;}
string Title {get;set;}
string Slug {get;set;}
DateTime PublishedDate {get;set;}
...
}
class TagNavigationPanelViewModel {
string TagText {get;set;}
int PostsCount {get;set;}
}
class CalendarNavigationPanelViewModel {
DateTime YearAndMonth {get;set;}
int PostsCount {get;set;}
}
Minha pergunta é - como combinar bem essas visões parciais.
O que estou fazendo é uma variação / combinação dos seus pontos 1 e 3. Combino os modelos de exibição em uma classe de contêiner e o uso como modelo de exibição "principal". A passagem das peças como modelos para as parciais.
Seguindo o seu exemplo, eu criaria esse viewmodel para a página padrão:
Em Default.cshtml
Em _TagNavigationPanel.cshtml
Em seguida, siga a mesma abordagem para uma única página de postagem:
E construa suas visualizações (cshtml (s)) de acordo
fonte
Você pode criar uma única exibição de "contêiner" com todas as três subvisões -
SinglePostView
,TagNavigationPanelView
eCalendarNavigationPanelView
. Você também pode substituir oSinglePostView
por qualquer outro modo de exibição exigido por uma página. Dessa forma, você só precisa substituir a exibição "central" (postagem) de páginas diferentes por outro tipo de exibição (por exemplo, lista de postagens) e as outras exibições precisam apenas ser atualizadas com os dados correspondentes, não substituídos.A visualização do contêiner (por exemplo
MyView
) deve conter referências a todas as subvisões. Pode terupdate
métodos diferentes usados para atualizar subvisões diferentes. Por exemplo -updateCalendar(CalendarNavigationPanelViewModel calendarData)
ouupdatePost(SinglePostViewModel postData)
. Ou até mesmo umupdate(IViewModel modelData)
- você precisará verificar o tipo (e transmitir) omodelData
para determinar qual visualização atualizarfonte