在菜单中应用安全性

时间:2015-08-18 04:56:09

标签: asp.net-mvc asp.net-mvc-3

下面是我的模特

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>
}

2 个答案:

答案 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;
}