MVC: как заставить контроллер отображать частичный вид, инициированный из представления
В моем проекте MVC5 я хочу создать меню в частичном представлении. Это меню является динамическим в том смысле, что оно построено из содержимого в моей базе данных. Таким образом, у меня есть контроллер, который заботится о создании моего меню и возвращении модели меню в мой частичный вид:
public PartialViewResult GetMenu()
{
MenuStructuredModel menuStructuredModel = menuBusiness.GetStructuredMenu();
return PartialView("~/Views/Shared/MenuPartial", menuStructuredModel);
}
В моем частичном представлении называется MenuPartial. Я хочу использовать бритву, чтобы перебирать элементы меню, например:
@model MyApp.Models.Menu.MenuStructuredModel
<div class="list-group panel">
@foreach (var category in Model.ViewTypes[0].Categories)
{
<a href="#" class="list-group-item lg-green" data-parent="#MainMenu">@category.ShownName</a>
}
</div>
Теперь проблема заключается в представлении, в котором я вставляю частичный вид. Если в представлении я просто делаю:
@Html.Partial("MenuPartial")
Он не будет вызывать контроллер, чтобы сначала заполнить модель данными. Я хочу, чтобы контроллер возвращал частичное. Но я не знаю, как это сделать с точки зрения. В псевдокоде я хотел бы сделать что-то вроде:
@Html.RenderPartialFromController("/MyController/GetMenu")
Ответы
Ответ 1
Благодаря Стивену Мюкке и Эрику Корторелею я получил его на работу.
Вот что должен выглядеть контроллер:
[ChildActionOnly]
public PartialViewResult GetMenu()
{
MenuStructuredModel menuStructuredModel = menuBusiness.GetStructuredMenu();
return PartialView("~/Views/Shared/MenuPartial", menuStructuredModel);
}
И он может вызываться как:
@Html.Action("GetMenu", "Home")
(Следовательно, GetMenu()
объявлен в HomeController
в моем примере).
Теперь контроллер вызывается (и модель заполняется) до отображения частичного представления.
Ответ 2
Вы должны использовать: @Html.RenderAction или @Html.Action