如何避免重复授权代码逻辑

Yan*_*vin 5 asp.net-mvc authorization asp.net-mvc-3

我编写了一个从System.Web.Mvc.AuthorizeAttribute派生的自定义授权属性.我正在从我的控制器成功使用它来限制对某些功能的访问.

public class ArticleController : Controller
{
    [CustomAuthorize(Role.Administrator)]
    public ActionResult Delete(int id)
    {
       // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好.现在我想根据相同的授权逻辑显示或隐藏HTML元素.例如,在我的视图"文章"中,如果用户不是管理员,我想隐藏操作按钮"删除".我写过类似的东西:

<ul id="menu">
   <li>@if (User.IsInRole(Role.Administrator)) { 
          @Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null)
       } </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它创建了代码逻辑重复,因为我需要指定两次必要的信用来执行操作:

  • 在控制器中阻止或允许操作.
  • 在视图中显示或隐藏操作链接.

避免这种重复的最佳方法是什么?有没有办法从视图中重用我的自定义授权属性?

goe*_*ing 3

自定义助手应该是最好的选择,例如:

@Html.SecureActionLink("Delete", "Delete", "Article")
Run Code Online (Sandbox Code Playgroud)

该帮助程序将检查某种服务以查看当前用户/角色是否具有此链接的权限。