如何在视图中没有逻辑的情况下控制用户/管理员可以看到的内容? MVC5

时间:2015-12-12 15:41:29

标签: asp.net-mvc views admin roles

我想简要介绍一下我的应用程序的外观。 如果您尚未登录,则会看到主页面,产品/用户/折扣等链接,但当您尝试访问这些链接时,您将被迫登录。

以用户身份登录后,您可以再次看到所有链接,但只能访问“产品”和“折扣”。 如果您以管理员身份登录,则可以访问任何内容。 根据您的角色,我应该使用什么来隐藏这些链接? (未注册/用户/管理员)

我不想在视图中使用逻辑。

为了限制访问我正在使用一个属性,我向Session传递具有role属性的当前UserViewModel。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以根据用户的个人资料制作菜单,传递值。

  1. 创建一个HTML.Helper来遍历此项并在View中呈现。

    public static MvcHtmlString SideBarItens(this HtmlHelper helper, IDictionary<string, string> model)
        {
            var stringBuilder = new StringBuilder();
    
            foreach (var item in model)
                stringBuilder.Append(string.Format("<li><a href=\"/{0}\">{1}</a></li>", item.Key, item.Value));
    
            return MvcHtmlString.Create(stringBuilder.ToString());
        }
    
  2. 为此菜单创建一个具有[ChildActionOnly]属性的操作,此操作的责任是获取用户的个人资料,并根据该操作获取此配置文件的菜单项,并将此值传递给您局部视图。您可以创建一个Dictionary来传递动作的常用名称以在HTML中呈现,并为该操作赋值。例如:new Dictionary{{"New Products", "Products/New"}}

  3. 在您的_Layout或任何默认共享视图中,您可以调用您的ChildAction。

    <div class="container-fluid" style="margin-top: 50px;">
        <div class="row">
            @Html.Action("Menu", "Base")
            <div class="col-sm-9 col-md-10 main">
                <ol class="breadcrumb" style="margin-top: 20px">
                    <li><a href="/Home">Home</a></li>
                </ol>
                @RenderBody()
            </div>
        </div>
    
  4. 你的行动

    [HttpGet, ChildActionOnly]
    public ActionResult Menu()
    {
         //Your logic to fill Dictionary and then returns
         return PartialView(dictionary)
    }
    
  5. 最后,您在菜单中创建了一个视图,它将您的词典作为模型接收并呼叫您的助手。

          @model IDictionary<string, string>    
          <li> 
              <ul class="nav-sidebar">
                  @Html.SideBarItens(Model)
              </ul>
          </li>  
    
  6. PS:我建议您缓存菜单操作