Sugestões sobre como realizar uma funcionalidade específica no MVC3

Eu tenho um aplicativo MVC3, com base no layout padrão do VS 2010, que eu mudei para parecer na imagem abaixo

Layout1

A área do submenu é definida em _layout.cshtml como

    <div id="sidebar">
    

Entities

    
    @Html.Partial("_EntitiesMenu")
        
    </div>
    
@RenderBody()
 

e o _EntitiesMenu contém entradas como abaixo

  • @Html.ActionLink("Addresses", "Index", "Address")
  •       
    
  • @Html.ActionLink("Applications", "Index", "Application")
  •        
    

    Eu tenho um único MapRoute definido como

    routes.MapRoute("Default",//Route name
        "{controller}/{action}/{id}",//URL with parameters
         { controller = "Home", action = "Index", id = UrlParameter.Optional });
    

    Todos os meus controladores de entidade iniciados a partir do menu são definidos como padrão em Controllers e exibições em Views.

    O que eu preciso é mudar o aplicativo para usar um layout como abaixo

    Layout2

    Quando os usuários clicam em Entidades, o aplicativo deve navegar para myapp/entities/ou myapp/entities/index e ele deve abrir uma visão na área de trabalho principal que será exibida abaixo

    Layout3

    Então, quando os usuários clicarem nos submenus da direita, a URL deverá se parecer com myapp/entities/entity1/index, myapp/entities/entity1/edit/1, etc (exatamente como agora, mas "under" na página de entidades.
    Eu defini o controlador de entidades como

    public class EntitiesController : Controller
    {
        public ActionResult Index()
        { return View();}
    }
    

    E a visão parece

    <div id="workarea">
       //here should became new Body region, to load all views called from the other controllers
       //something like @RenderBody(), but this don't works
    </div>
    <div id="sidebar">
    

    Entities

    
    
      @Html.Partial("_EntitiesMenu")
            
    </div>
    

    Eu não quero ter que fazer alterações nas entidades controllers ou views (ou mudanças mínimas, se forem absolutamente necessárias, porque existem muitas delas). Posso de alguma forma atribuir essa área como corpo principal, enquanto sob o escopo de entidades? E se o usuário clicar em cima Home/About, ele irá "descarregar" o EntitiesView de _layout.cshtml?

    Não tenho certeza se a minha pergunta é muito clara, mas espero que alguém entenda o que eu estou procurando.

    Obrigado

    0

    2 Respostas

    1
    adicionado
    Não é bem assim, porque @RenderSection pode ser apenas na exibição principal e queria tê-lo na visualização Índice de entidades. Eu consegui "hackear" (algo assim) para obter algo próximo do que eu preciso, mas era necessário mudar TODAS as views, primeiro para "quebrar" o código da view em @section {..} e então para carregar o menu Entities ver como parcial. Não é uma boa solução porque envolve a troca de muitos arquivos e o design não está limpo. Alguma outra ideia?
    adicionado o autor bzamfir, fonte

    Eu consegui (mais ou menos) realizar algo próximo ao que eu preciso usando a seguinte abordagem:

    1. Changed the _layout as below

      <div> @RenderBody() </div> <div> @RenderSection("EntityCRUD", false) </div>
       
      
    2. Created the view for Entities as:

      @Html.Partial("_PanelEntitiesMenu")

    3. Defined _PanelEntitiesMenu as

      <div id="sidebar">
      

      Entities


        @Html.Partial("_EntitiesMenu")
              
      </div> 
      
    4. Enclosing the entities views (Index, Edit/Delete/Details/Create) in

      @section EntityCRUD
      {
      @Html.Partial("_PanelEntitiesMenu")
      //... original view code
      }
      
    5. Changed all involved views to have the view "body" included in section, and at the beginning of the section I load the panel menu as partial view

      @section EntityCRUD
      {
          @Html.Partial("_PanelEntitiesMenu")
          ....
      }
      

    Não exatamente o que eu queria, mas foi o melhor que encontrei até agora.

    0
    adicionado