У меня есть _layout.cshtml, содержащий эту строку:
@{Html.RenderPartial("Menu");}
Теперь я хочу передать модель в эту RenderPartial-функцию. Эту модель можно прочитать в моем репозитории.
Как и где (в коде) это можно сделать?
Спасибо!
У меня есть _layout.cshtml, содержащий эту строку:
@{Html.RenderPartial("Menu");}
Теперь я хочу передать модель в эту RenderPartial-функцию. Эту модель можно прочитать в моем репозитории.
Как и где (в коде) это можно сделать?
Спасибо!
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
})
}
Будет ли это ближе к решению?
Есть и другое решение для передачи данных в частичное представление в Layout. Вы можете просто добавить это в свой файл _Layout.cshtml
@Html.Action("ActionName","ControllerName")
И в вашем контроллере:
[ChildActionOnly]
public ActionResult ActionName()
{
var model = new YourModel();
return PartialView(model);
}
Атрибут ChildActionOnly
гарантирует, что метод действия может быть вызван только как дочерний метод. Это действие отобразит соответствующий частичный вид с моделью в компоновке.