Как передать данные в PartialView в моем макете?

У меня есть _layout.cshtml, содержащий эту строку:

@{Html.RenderPartial("Menu");}

Теперь я хочу передать модель в эту RenderPartial-функцию. Эту модель можно прочитать в моем репозитории.

Как и где (в коде) это можно сделать?

Спасибо!


person Erik Z    schedule 30.09.2011    source источник


Ответы (2)


RenderPartial имеет перегрузку, которая может принимать объект для отправки его в частичное представление. Не забудьте определить свою @model в верхней части частичного представления для работы с правильным типом объекта.

@ Html.RenderPartial ("ViewName", объект)

Дополнительная информация: MSDN

Изменить после комментария:

Я думаю, что было бы проще создать MenuController, который принимает репозиторий. Затем позвольте ему создать представление, которое принимает требуемый репозиторий в качестве модели, затем с помощью foreach визуализирует каждый пункт меню как ссылки на действия, передавая ему информацию о меню.

Итак, у вас будет это в вашем _layout.cshtml:

<div id="Menu">
    @{Html.RenderAction("Menu", "Menu");}
</div>

Это в вашем MenuController:

public class MenuController : Controller
{
    private IMenuRepository _repository;

    public MenuController(IMenuRepository repo)
    {
        _repository = repo;
    }
    //
    // GET: /Menu/

    public PartialViewResult Menu(string menu = null)
    {
        ViewBag.SelectedMenu = menu;

        IEnumerable<MenuInfoObject> menus= _repository.Menus;
        return PartialView(menus);
    }
}

И ваш MenuView:

    @model IEnumerable<MenuInfoObject>
@{
    Layout = null;
}
@foreach (var item in Model)
{
    @Html.RouteLink(item.MenuName, new
{
    controller = item.ControllerInfo,
    action = item.ActionInfo,
}, new
       {
           @class = item.Menu == ViewBag.SelectedMenu ? "selected" : null
       })
}

Будет ли это ближе к решению?

person Tom Ceuppens    schedule 30.09.2011
comment
Я знаю это, но я в своем файле layout.cshtml. Где мне прочитать мою модель из репозитория? - person Erik Z; 30.09.2011

Есть и другое решение для передачи данных в частичное представление в Layout. Вы можете просто добавить это в свой файл _Layout.cshtml

@Html.Action("ActionName","ControllerName")

И в вашем контроллере:

    [ChildActionOnly]
    public ActionResult ActionName()
    {
        var model = new YourModel();
        return PartialView(model);

    }

Атрибут ChildActionOnly гарантирует, что метод действия может быть вызван только как дочерний метод. Это действие отобразит соответствующий частичный вид с моделью в компоновке.

person Aliasgar Rajpiplawala    schedule 23.07.2014