2011-02-23 60 views
5

我写了一个从System.Web.Mvc.AuthorizeAttribute派生的自定义授权属性。我从我的控制器成功使用它来限制对某些功能的访问。如何避免授权码逻辑的重复

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

而且工作正常。现在我想根据相同的授权逻辑显示或隐藏HTML元素。例如,在我看来的“文章”中,如果用户不是管理员,我想隐藏操作按钮“删除”。我已经写了这样的事情:

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

它的工作原理也很有效,但它创造的代码逻辑复制,因为我需要指定两次必要credientials要执行的操作:

  • 在控制器阻止或允许该行为。
  • 用于显示或隐藏操作链接。

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

回答

3

自定义助手应该是最好的选择,这样的:

@Html.SecureActionLink("Delete", "Delete", "Article") 

这个助手将检查某种服务,以查看当前用户/角色拥有此链接的权限。

1

我会为此创建自定义html助手。

public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper, 
string actionName, ... , Role role) 

如果你觉得角色参数是多余的,你可以使用反射检查控制器的动作并自动确定允许的角色。