2011-02-23 63 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) 

如果你覺得角色參數是多餘的,你可以使用反射檢查控制器的動作並自動確定允許的角色。