【发布时间】:2016-09-20 05:45:53
【问题描述】:
Html.RenderPartial 的其中一个重载允许您传入模型。你怎么能从_Layout.cshtml使用它?
我有一个模型,准备好了我需要的一切。我只是看不到如何使它可以被布局访问。
_Layout.cshtml
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<nav>
@{ Html.RenderPartial("pMenu", menu); }
</nav>
...
pMenu.cshtml
菜单的局部视图。希望这可以清楚地表明菜单是动态的,并且确实需要传递给它的模型。
@model MyApplication.Menu
@foreach (KeyValuePair<string, MyApplication.MenuGroup> group in Model.group)
{
if (group.Key != "default")
{
<div>@group.Key.ToString()</div>
}
<ul>
@foreach (MyApplication.MenuItem item in group.Value.items.Values)
{
<li>
@if (item.isCurrent)
{
<span class="@item.Icon">@item.LinkText</span>
}
else
{
@Html.ActionLink(item.LinkText, item.Action, item.Controller, item.RouteValues, new { @class = @item.Icon })
}
@if (null != item.subItems)
{
<ul class="tree">
@foreach (MyApplication.SubItem subitem in item.subItems)
{
<li>
@if (subitem.isCurrent)
{
<span>@subitem.LinkText</span>
}
else
{
@Html.ActionLink(subitem.LinkText, subitem.Action, subitem.Controller, subitem.RouteValues, null)
}
</li>
}
</ul>
}
</li>
}
</ul>
}
菜单在哪里实例化?
public class MainController : Controller
{
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
menu = new Menu(requestContext.RouteData.Values);
背景信息
这是一个 Intranet 应用程序。它没有“主页”、“关于”、“联系方式”等典型的硬编码菜单选项。大多数菜单都是从用户维护的数据库记录中创建的。菜单是为用户个性化的。没有两个用户会有相同的菜单项。例如:经理为每个员工获取一个菜单项。
菜单模型还处理使菜单“动态”的其他因素,例如:
- 识别请求的页面是否匹配给定的菜单项(通过路由数据)(用于样式)
- 根据角色添加额外的菜单项
- 有时会为当前上下文添加子菜单
这似乎与#Render partial with a model in Layout View 相似,但我认为这个问题通过提及会话而偏离了轨道。
免责声明:我是一名经验丰富的程序员,但对 C# 和 asp.NET MVC 比较陌生。
【问题讨论】:
-
你试过
@Html.Partial("pMenu", menu)吗?假设pMenu.cshtml在~/Views/Shared/ -
@Yvette 我认为我第一次提出这个问题时非常令人困惑。希望编辑后会更清晰一些。
-
@jrummell 无论哪种方式,编译器错误消息:CS0103:当前上下文中不存在名称“菜单”
-
那么,您需要声明并实例化该变量。
-
@jrummell 我正在通过 Controller 类的扩展在每个页面加载时实例化菜单。
标签: c# asp.net-mvc asp.net-mvc-5