Onde aplicar a lógica para um controle da barra lateral no ASP.NET MVC
Pergunta
Veja o exemplo de querer ter uma barra lateral "itens mais recentes" em todas as páginas do seu site ASP.NET MVC. Eu tenho um NewsItemController, o que é bom para páginas que dedicam sua atenção aos NewsItems. Que tal ter uma barra lateral de notícias aparecendo no controlador de volta para a página inicial? Ou qualquer outro controlador para esse assunto?
Meu primeiro instinto é colocar a lógica para selecionar os 5 principais NewsItems em um controle de usuário que é chamado na Página Master. Dessa forma, todas as páginas recebem uma barra lateral de notícias sem precisar contaminar nenhum dos outros controladores com a lógica do Newsitem. Isso significa colocar a lógica no que eu entendi como a camada de apresentação que normalmente entraria em um controlador.
Eu posso pensar em cerca de meia dúzia de maneiras diferentes de abordá-lo, mas nenhuma delas parece 'certa' em termos de separação de preocupações e outras palavras-de-buzz relacionadas.
Solução 2
http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx
Isso parece abordar a questão - mesmo usando a instância de uma barra lateral - mas usando um recurso não incluído no MVC 1 por padrão.
http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx
Isso também indica que a resposta está na renderização.
Para qualquer outra pessoa interessada, eis como eu acabei fazendo isso. Observe que você precisará a montagem futuros do MVC para renderização.
Basicamente, você teria algo assim em seu controlador:
public class PostController
{
//...
public ActionResult SidebarBox()
{
// I use a repository pattern to get records
// Just replace it with whatever you use
return View(repoArticles.GetAllArticles().Take(5).ToList());
}
//...
}
Em seguida, crie uma visualização parcial para a caixa lateral com o conteúdo que você deseja exibido e na sua página mestre (ou onde quiser exibi -lo), você usaria:
<% Html.RenderAction<PostController>(c => c.SidebarBox()); %>
Afinal, não é tão difícil.
Outras dicas
Eu acho que você deve considerar colocá -lo em sua página mestre. Seu controlador pode coletar dados (de forma assíncrona, é claro), armazená -los em uma bela propriedade ViewModel para sua visualização (ou em tempdata) e, em seguida, você pode chamar renderpartial () em sua página mestre para renderizar os dados.
O mantém tudo "separado"
- Você pode criar um controle do usuário (.ascx) e depois ligar para renderpartial ().
- Projete um método no seu controlador com JSONResult como tipo de retorno. Use -o junto com o jQuery.
- Use renderaction () conforme sugerido por outros lugares.