Предложения о том, как выполнить определенную функциональность в MVC3

#asp.net-mvc-3 #asp.net-mvc-routing #asp.net-mvc-3-areas

#asp.net-mvc-3 #asp.net-mvc-routing #asp.net-mvc-3-areas

Вопрос:

У меня есть приложение MVC3, основанное на макете по умолчанию из VS 2010, который я изменил, чтобы он выглядел как на изображении ниже

Layout1

Область подменю определена в _layout.cshtml как

     <div id="sidebar">
    <h3>Entities</h3>
    <p></p>
        <ul>
            @Html.Partial("_EntitiesMenu")
        </ul>        
    </div>
    <section id="main">
        @RenderBody()
    </section>
  

и _EntitiesMenu содержит записи, как показано ниже

 <li>@Html.ActionLink("Addresses", "Index", "Address")</li>      
<li>@Html.ActionLink("Applications", "Index", "Application")</li>       
  

У меня есть единственный MapRoute, определенный как

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

Все мои контроллеры сущностей, запускаемые из menu, определены стандартно в контроллерах, а представления — в представлениях.

Что мне нужно, так это изменить приложение, чтобы использовать макет, как показано ниже

Layout2

Когда пользователи нажимают Entities, приложение должно перейти к myapp / entities / или myapp / entities / index и должно открыть представление в основной рабочей области, которое будет выглядеть следующим образом

Layout3

Затем, когда пользователи нажимают на правое подменю, URL-адрес должен выглядеть как myapp / entities /entity1 /index, myapp / entities / entity1 / edit / 1 и т.д. (Точно так же, как сейчас, но «под» страницей сущностей.
Я определил контроллер сущностей следующим образом

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

И это представление выглядит следующим образом

 <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">
<h3>Entities</h3>
<ul>
    @Html.Partial("_EntitiesMenu")
</ul>        
</div>
  

Я не хочу вносить изменения в контроллеры объектов или представления (или минимальные изменения, если это абсолютно необходимо, потому что их много). Могу ли я каким-то образом назначить эту область в качестве основного тела, находясь в области объектов? И если пользователь нажмет сверху Home / About, это «выгрузит» EntitiesView из _layout.cshtml?

Не уверен, что мой вопрос предельно ясен, но я надеюсь, что кто-нибудь поймет, к чему я стремлюсь.

Спасибо

Ответ №1:

Комментарии:

1. Не совсем, потому что @RenderSection может быть только в главном представлении, и я хотел иметь его в представлении индекса объектов. Мне удалось «взломать» это (вроде как), чтобы получить что-то близкое к тому, что мне нужно, но для этого потребовалось изменить ВСЕ представления, сначала «обернуть» код представления в @section{..}, а затем загрузить представление меню объектов как частичное. Не очень хорошее решение, потому что оно включает в себя изменение большого количества файлов, а дизайн не является чистым. Есть еще идеи?

Ответ №2:

Мне удалось (вроде как) выполнить что-то близкое к тому, что мне нужно, используя следующий подход:

  1. Изменен _layout, как показано ниже

     <section id="main">
        <div>
            @RenderBody()
        </div>
        <div>
            @RenderSection("EntityCRUD", false)
        </div>
    </section>
      
  2. Создал представление для объектов как:

    @Html.Partial(«_PanelEntitiesMenu»)

  3. Определено _PanelEntitiesMenu как

     <div id="sidebar">
    <h3>Entities</h3>
    <p></p>
        <ul>
        @Html.Partial("_EntitiesMenu")
        </ul>        
    </div> 
      
  4. Включение представлений объектов (индексирование, Редактирование / удаление / Сведения / создание) в

     @section EntityCRUD
    {
    @Html.Partial("_PanelEntitiesMenu")
    //... original view code
    }
      
  5. Изменены все задействованные представления, чтобы включить представление «body» в раздел, и в начале раздела я загружаю меню панели как частичный вид

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

Не совсем то, что я хотел, но это лучшее, что я нашел на данный момент.