繁体   English   中英

ASP.NET MVC3视图授权设计

[英]ASP.NET MVC3 view authorization design

假设您有一个受保护的站点和一个可以按照用户角色以多种方式生成的视图。 假设管理员看到了所有内容,经理看到了一些列和一些操作按钮,用户看到了其他列和其他操作按钮。

您将如何实施? 据我所知,有三个主要选项:

  • 具有[Authorize]属性的控制器,并且该操作将为每个用户角色返回1个视图,即针对该角色量身定制的那些视图;
  • 具有[Authorize]属性的控制器,其操作返回所有角色的1 View,具有隐藏/显示列,字段,按钮的逻辑;
  • 具有[Authorize]属性的控制器,其操作返回1个View,根据角色,它们呈现不同的Partial View。

我更喜欢第三种方法,但是您看到一种更好的方法吗?

先感谢您

根据您视图的复杂程度,第一种或第三种选择对我来说似乎不错。 至于第二种选择; 通常建议避免视图中的逻辑,因此我会远离该视图。

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

我对菜单和其他导航项所做的就是为其提供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>

我希望这会给你想法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM