Подтвердить что ты не робот

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")
4b9b3361

Ответ 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