部分视图中的变量在布局视图中无法访问

时间:2013-01-25 06:32:11

标签: c# asp.net-mvc-4

我有一个名为 _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>

0 个答案:

没有答案