【问题标题】:ASP.NET MVC3 view authorization designASP.NET MVC3视图授权设计
【发布时间】:2012-03-12 18:52:37
【问题描述】:

假设您有一个安全站点和一个可以通过多种方式生成的视图,具体取决于用户角色。比如说,管理员可以看到所有内容,经理可以看到一些列和一些操作按钮,用户可以看到其他列和其他操作按钮。

您将如何实现这一点?在我看来,主要有以下三种选择:

  • 具有 [Authorize] 属性的控制器和每个用户角色返回 1 个视图的操作,即为角色量身定制的视图;
  • 具有 [Authorize] 属性的控制器和为所有角色返回 1 个视图的操作,具有隐藏/显示列、字段、按钮的逻辑;
  • 具有 [Authorize] 属性的控制器和返回 1 个视图的操作,根据角色呈现不同的部分视图。

我更喜欢第三种方法,但您有没有更好的实现方法?

提前谢谢你

【问题讨论】:

    标签: asp.net-mvc authorization


    【解决方案1】:

    我一直在为菜单和其他导航项做的是我有一个 ViewModel 类。这是一个简化的版本。

    视图模型

    public class Action
    {
        public string DisplayName { get; set; } // localized
        public string Url { get; set;
    }
    
    public class MenuViewModel
    {
        public List<Action> Actions { get; set; }
    
        public MenuViewModel()
        {
            this.Actions = new List<Action>();
        }
    }
    

    我根据用户角色填写。管理员获得更多链接等。

    ViewModel 是“主”视图模型的一部分

    public class AlbumEditorViewModel
    {
        public MenuViewModel Menu { get; set; }
    }
    

    然后我将为负责菜单的部分视图传递该视图模型。

    查看(剃刀)

    @model AlbumEditorViewModel
    
    .. razor stuff here ..
    @Html.Partial("Menu", Model.Navigation)
    .. razor stuff here ..
    

    局部视图

    @model MenuViewModel
    
    <ul>
        @foreach (var action in Model.Actions)
        {
            <li>
                @GridHelper.GetAction(action)
            </li>
        }
    </ul>
    

    我希望这会给你一些想法

    【讨论】:

    • 我也有这个,但是如果您的 Partial 包含一个包含列、按钮、一些字段的表格,并且它们应该根据用户角色显示或不显示怎么办?
    • 一种解决方案是创建包含非常简单逻辑的声明性帮助器:显示或不显示
    【解决方案2】:

    根据您的观点的复杂性,第一个或第三个选项对我来说似乎都可以。至于第二种选择;它通常建议避免视图中的逻辑,所以我会远离那个。

    如果您选择第三个选项,您应该考虑使用 EditorTemplates 和 DisplayTemplates。这将允许您使您的(主)视图与要渲染的部分视图无关。 让您的视图模型(或它的一部分)从单个基类继承。为每种视图模型类型创建显示和/或编辑器模板,并在您的视图中说Html.DisplayFor( ... )Html.EditorFor( ... )。 MVC 将自动选择正确的模板,而不需要您的视图中的逻辑。

    【讨论】:

    • 我确实喜欢您的方法,使视图与要渲染的部分无关。我将看一下 DisplayFor 辅助功能。谢谢!
    • 尽管我不打算实施此解决方案,但我确实认为这是解决问题的最佳方法。现在我将使用一个更简单的解决方案,如果管理视图的复杂性增加,我将重构这个解决方案。干杯!
    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 2013-02-13
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多