在菜单中应用安全性
applying security among menus
下面是我的模型
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
并且可以增加它 later.So 我必须创建每个子菜单的单独会话变量。有没有更好的办法解决这个问题?
已编辑
@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>
}
您的另一个选择是创建 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;
}
我建议使用视图模型方法来表示您的菜单项
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
项,并根据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>
最后在布局页面中,使用Html.Action()
调用生成菜单项的方法
@Html.Action("Menu", yourControllerName)
下面是我的模型
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
并且可以增加它 later.So 我必须创建每个子菜单的单独会话变量。有没有更好的办法解决这个问题?
已编辑
@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>
}
您的另一个选择是创建 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;
}
我建议使用视图模型方法来表示您的菜单项
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
项,并根据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>
最后在布局页面中,使用Html.Action()
调用生成菜单项的方法
@Html.Action("Menu", yourControllerName)