#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, который я изменил, чтобы он выглядел как на изображении ниже
Область подменю определена в _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, определены стандартно в контроллерах, а представления — в представлениях.
Что мне нужно, так это изменить приложение, чтобы использовать макет, как показано ниже
Когда пользователи нажимают Entities, приложение должно перейти к myapp / entities / или myapp / entities / index и должно открыть представление в основной рабочей области, которое будет выглядеть следующим образом
Затем, когда пользователи нажимают на правое подменю, 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:
Вы говорите о @RenderSection http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx
Комментарии:
1. Не совсем, потому что @RenderSection может быть только в главном представлении, и я хотел иметь его в представлении индекса объектов. Мне удалось «взломать» это (вроде как), чтобы получить что-то близкое к тому, что мне нужно, но для этого потребовалось изменить ВСЕ представления, сначала «обернуть» код представления в @section{..}, а затем загрузить представление меню объектов как частичное. Не очень хорошее решение, потому что оно включает в себя изменение большого количества файлов, а дизайн не является чистым. Есть еще идеи?
Ответ №2:
Мне удалось (вроде как) выполнить что-то близкое к тому, что мне нужно, используя следующий подход:
-
Изменен _layout, как показано ниже
<section id="main"> <div> @RenderBody() </div> <div> @RenderSection("EntityCRUD", false) </div> </section>
-
Создал представление для объектов как:
@Html.Partial(«_PanelEntitiesMenu»)
-
Определено _PanelEntitiesMenu как
<div id="sidebar"> <h3>Entities</h3> <p></p> <ul> @Html.Partial("_EntitiesMenu") </ul> </div>
-
Включение представлений объектов (индексирование, Редактирование / удаление / Сведения / создание) в
@section EntityCRUD { @Html.Partial("_PanelEntitiesMenu") //... original view code }
-
Изменены все задействованные представления, чтобы включить представление «body» в раздел, и в начале раздела я загружаю меню панели как частичный вид
@section EntityCRUD { @Html.Partial("_PanelEntitiesMenu") .... }
Не совсем то, что я хотел, но это лучшее, что я нашел на данный момент.