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

时间:2010-04-27 19:43:33

标签: asp.net-mvc validation authorization

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

我要求只显示当前用户可以执行的操作,但我不希望使用授权来混淆视图if-else's

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

到目前为止,我最好的方法是为需要权限的Html.ActionLink扩展方法提供重载,但是会有更复杂的方案,例如隐藏整个html块或切换文本框标签+隐藏。

有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

我能想到的一个例子是调用Html.RenderAction(链接:http://msdn.microsoft.com/en-us/library/ee703490.aspx),然后将您希望用作路由值的链接传递给action方法(它将显示为参数你的行动)。因为它是一个RenderAction,所以您可以返回控制器进程,因此您可以根据用户的状态呈现所需的任何视图或数据。

示例:

<% 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");
}

答案 1 :(得分:0)

我们遇到了同样的问题。我们最终编写了很多辅助方法,并且在需要大量html输出的情况下,我们将它们放在部分视图中。

答案 2 :(得分:0)

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

视图应仅用于呈现信息,实际上不应包含任何条件逻辑,或至少是最低限度。

我总是发现,当我发现很难找到像你这样的情况时,最好的解决办法就是回到控制器并进行电子评估我传递到从一开始就看。

当调用View来完成其工作时,所有重要的“决定”应该已经完成​​。

答案 3 :(得分:0)

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

视图模型

public class ModelView
{
    private IAuthorisationService { get; set; }

    public bool CanShow
    {
        ...
    }
}

查看:

<% if(Model.CanShow) { %>
    <html>
<% } %>

答案 4 :(得分:0)

我个人认为视图中的这种条件逻辑没有任何问题。逻辑仍然是关于演示。您决定是显示还是隐藏,启用或禁用,突出显示等。这是视图的作业,而不是控制器的作业。只要视图不需要实际计算任何东西来做出决定。控制器应该与视图的实现无关,反之亦然。

我的方法是:

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

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