我有一个名为 _Menu.cshtml 的部分视图,使用下面的代码。使用局部视图时,主 _Layout.cshtml 视图中的代码例程无法找到变量“menus”。如果我将 _Menu.cshtml 代码复制到我的 _Layout.cshtml 中,我的例程就可以完美运行。我知道 _Layout.cshtml 可以访问我的部分视图 _Menu.cshtml ,因为如果我在部分视图中放置“hello world”,它会按预期显示在_Layout.cshtml中。
仅供参考,我的登录/注销将会话[“MyMenu”]设置为null。所以我正在为菜单使用会话缓存来提高速度。
这是我的部分视图 _Menu.cshtml ::
@{
var menus = new[]
{
new { LinkText="Home", ActionName="Index",ControllerName="Home",Roles="All" },
new { LinkText="About", ActionName="About",ControllerName="Home",Roles="Anonymous" },
new { LinkText="Contact", ActionName="Contact",ControllerName="Home",Roles="Anonymous" },
new { LinkText="Dashboard", ActionName="Index",ControllerName="Admin",Roles="Anonymous" },
new { LinkText="Administration", ActionName="GetUsers",ControllerName="Admin",Roles="Administrator" },
new { LinkText="My Profile", ActionName="GetDealerInfo",ControllerName="Dealer",Roles="Dealer,PublicUser" },
new { LinkText="Products", ActionName="GetProducts",ControllerName="Product",Roles="Dealer,Administrator" },
new { LinkText="Search", ActionName="SearchProducts",ControllerName="Product",Roles="PublicUser,Dealer,Administrator" },
new { LinkText="Purchase History", ActionName="GetHistory",ControllerName="Product",Roles="PublicUser" },
};
}
这是我的部分视图 _Layout.cshtml ::
<nav>
@if (System.Web.HttpContext.Current.Session["MyMenu"] == null)
{ System.Web.HttpContext.Current.Session["MyMenu"] = Html.Partial("~/Views/Shared/_Menu.cshtml"); }
@System.Web.HttpContext.Current.Session["MyMenu"]
</nav>
<ul id="menu">
@*<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
<li>@Html.ActionLink("Codes", "Index", "xRefCodes")</li>*@
@if (HttpContext.Current.User.Identity.IsAuthenticated)
{
String[] roles = Roles.GetRolesForUser();
var links = from item in menus
where item.Roles.Split(new String[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Any(x => roles.Contains(x) || x == "All")
select item;
foreach (var link in links)
{
@: <li> @Html.ActionLink(link.LinkText, link.ActionName,link.ControllerName)</li>
}
}
else{
var links = from item in menus
where item.Roles.Split(new String[]{","},StringSplitOptions.RemoveEmptyEntries)
.Any(x=>new String[]{"All","Anonymous"}.Contains(x))
select item;
foreach ( var link in links){
@: <li> @Html.ActionLink(link.LinkText, link.ActionName, link.ControllerName)</li>
}
}
</ul>