代码之家  ›  专栏  ›  技术社区  ›  David Lay

如何在MVC中保持视图不受授权逻辑的影响?

  •  5
  • David Lay  · 技术社区  · 16 年前

    我有一个视图显示项目列表。 用户可以编辑、删除或创建新项目,但根据他们的授权,他们可以或不可以执行某些操作。

    我需要只显示当前用户可以执行的操作,但是我不想在其他用户的权限下混乱视图

    尽管这是一个非常普遍的要求,我还是找不到一个真正令人满意的方法。

    到目前为止,我的最佳方法是为 Html.ActionLink 一种扩展方法,它具有请求权限,但会有更复杂的场景,例如隐藏整个HTML块或为标签+隐藏切换文本框。

    有更好的方法吗?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Tejs    16 年前

    我能想到的一个例子是调用html.renderAction(链接: http://msdn.microsoft.com/en-us/library/ee703490.aspx ,然后将要用作路由值的链接传递给action方法(它将显示为操作的参数)。因为它是一个渲染,所以您需要返回到控制器进程,这样您就可以让它渲染您想要的任何视图或数据,具体取决于用户的状态。

    例子:

    <% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %>
    

    你的控制器应该有:

    public ActionResult PermissionsLink (string url)
    {
         // Do Whatever kind of Authentication you want here, Session is available, etc
    
         if(authenticated)
            return View("Link");
         else
            return View("Blank");
    }
    
        2
  •  0
  •   Raj Kaimal    16 年前

    我们有同样的问题。最后我们编写了很多助手方法,在需要大量HTML输出的情况下,我们将它们放在部分视图中。

        3
  •  0
  •   krisg    16 年前

    根据用户可以更改的值创建多个具有各种控件的视图,然后根据用户的访问权限返回正确的视图,这难道不简单吗?

    视图应该只用于显示信息,实际上不应该包含任何条件逻辑,或者至少是最低限度的条件逻辑。

    我总是发现,当我发现很难摸索到像你这样的情况时,最好的解决办法总是回到控制者那里,从一开始就对我传递给视图的内容进行电子评估。

    当视图被调用来完成它的工作时,所有重要的“决策”都应该已经做出了。

        4
  •  0
  •   dariol    15 年前

    在复杂的情况下,有许多条件和规则,我这样做:

    视图模型

    public class ModelView
    {
        private IAuthorisationService { get; set; }
    
        public bool CanShow
        {
            ...
        }
    }
    

    观点:

    <% if(Model.CanShow) { %>
        <html>
    <% } %>
    
        5
  •  0
  •   Sebastien Martin    14 年前

    我个人认为这种条件逻辑在视图中没有任何问题。逻辑仍然是关于表示的。您可以决定是显示还是隐藏、启用还是禁用、突出显示等。这是视图的工作,而不是控制器的工作。只要视图不需要实际计算任何东西来做出决定。控制器应该和其他方法一样不可知视图的实现。

    我的方法是:

    • 使控制器执行决定用户访问级别的实际逻辑
    • 使用(即通过ViewModel)将此信息传递给视图,但传递方式与实现细节无关(即“用户是管理员”、“用户是作者”等)。
    • 让视图仅使用控制器提供的预编译数据适当地绘制自己。

    这样做的好处是视图本身可以被删除和替换,而不会对控制器产生任何影响。