【发布时间】:2011-09-30 08:41:32
【问题描述】:
我有一个包含这一行的 _layout.cshtml:
@{Html.RenderPartial("Menu");}
现在我想将模型传入这个 RenderPartial 函数。可以从我的存储库中读取此模型。
如何以及在哪里(在代码中)可以做到这一点?
谢谢!
【问题讨论】:
标签: asp.net-mvc-3 razor partial-views
我有一个包含这一行的 _layout.cshtml:
@{Html.RenderPartial("Menu");}
现在我想将模型传入这个 RenderPartial 函数。可以从我的存储库中读取此模型。
如何以及在哪里(在代码中)可以做到这一点?
谢谢!
【问题讨论】:
标签: asp.net-mvc-3 razor partial-views
RenderPartial 有一个重载,可以将一个对象发送到局部视图。 不要忘记在局部视图顶部定义 @model 以使用正确的对象类型。
@Html.RenderPartial("ViewName",object)
额外信息: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.cshtml 文件中
@Html.Action("ActionName","ControllerName")
在你的控制器中:
[ChildActionOnly]
public ActionResult ActionName()
{
var model = new YourModel();
return PartialView(model);
}
ChildActionOnly 属性确保动作方法只能作为子方法调用。这个动作会在 Layout 中渲染对应的带有模型的局部视图。
【讨论】: