ASP.NET MVC3视图授权设计

时间:2012-02-22 12:37:42

标签: asp.net-mvc authorization

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

你会如何实现这个?据我所知,有三个主要选择:

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

我更喜欢第三种方法,但您是否看到了更好的方法来实现它?

提前谢谢

2 个答案:

答案 0 :(得分:2)

根据视图的复杂程度,第一个或第三个选项对我来说似乎没问题。至于第二种选择;它通常建议避免视图中的逻辑,所以我要远离那个。

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

答案 1 :(得分:0)

我一直在为菜单和其他导航项目做的是我有一个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>

我希望这会给你一些想法