我如何控制 user/admin 在视图中没有逻辑的情况下可以看到的内容? MVC 5

How can I control what an user/admin can see without logic in views? MVC5

我想简要介绍一下我的应用程序的外观。 如果您没有登录,您看到的是主页和 Products/Users/Discounts 等链接,但是当您尝试访问这些链接时,您将被强制登录。

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

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

为了限制访问,我使用了一个属性,并将当前的 UserViewModel 传递给 Session,它具有 属性 的角色。

谢谢!

您可以动态地制作菜单,根据用户的配置文件传递值。

  1. 创建一个 HTML.Helper 以遍历此项目并在您的视图中呈现。

    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. 为此Menu创建一个Action,带有[ChildActionOnly]属性,此Action的职责是获取用户的资料,并根据该资料获取该资料的菜单项,并通过这对您的局部视图很重要。您可以创建一个字典来传递操作友好的名称以在 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>  
    

PS: 我建议你缓存你的菜单操作