下面是我的模特
public class security
{
public long id { get; set; }
public long user_id { get; set; }
public long submenu_id { get; set; }
public bool flag { get; set; }
}
标志为true
,用户可以访问子菜单。
目前我在做的是。当用户登录时,此模型中的详细信息将被拉出并存储在单独的会话变量中。
eg: - var c = db.security.where(m=> m.user_id == id).Orderby(id);
if(c.submenu_id == 1 && c.flag == true)
session["mem_add"] = "true";
else
session["mem_add"] = "false";
然后在布局视图中将检查此会话变量,如果true
菜单将显示,但问题是16 sub menus
并且可以在以后增加它。所以我必须创建单独的会话变量for每个子菜单。有没有更好的方法来解决这个问题?
被修改
@if(Session["mem_add"] == "true")
{
<li class="active"><a href="@Url.Action("Index", "UpdateDetail")">
<img src="@Url.Content("~/Images/Enrollments.png")" alt=""><span class="title"><b>
@Resources.Resources.UpdateMyDetail</b> </span> </a></li>
}
答案 0 :(得分:2)
我建议使用视图模型方法来表示菜单项
EOF;}}
然后,当用户登录时,创建一个菜单项集合,调用方法获取用户的public class MenuItem
{
public int ID { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string LinkText { get; set; }
public string ImageUrl { get; set; }
public bool CanView { get; set; }
}
项,并根据security
属性设置{{1}每个菜单的属性。最后将集合存储在flag
然后创建一个仅限子项的方法来生成菜单
CanView
并创建部分视图Session
[ChildActionOnly]
public ActionResult Menu
{
IEnumerable<MenuItem> model = Session["Menu"] as IEnumerable<MenuItem>;
// check for null and rebuild if necessary
return PartialView("_Menu", model);
}
最后在布局页面中,使用_Menu.cshtml
来调用生成菜单项的方法
@model IEnumerable<yourAssembly.MenuItem>
<ul>
@foreach(var menu in Model)
{
if (menu.CanView)
{
<li>
<a href=""@Url.Action(menu.ActionName, menu.ControllerName)">
<img src="@Url.Content(menu.ImagePath)" alt="">
<span class="title"><b>menu.LinkText</b></span>
</a>
</li>
}
}
</ul>
答案 1 :(得分:1)
您的另一个选择是创建HtmlHleper的扩展,然后您可以使用它将模型传递到您的菜单并让它生成一个MvcHtmlString
public MvcHtmlString CreateMenu(this HtmlHelper helper, MenuSecurityModel)
{
//create tags, string, etc
//create logic add/remove meun items depending on flag property on model
//this can be accomplished also by using a base class for your Controllers,
//set the the onactionexecuting variable to set the menu[ put it in session accodingly, retrieve when appropriate
//Call using Html.RenderAction , partial, etc
return yourHtmlString;
}