2

我們知道授權的東西是一個橫切關注點,我們盡我們所能避免在我們的視圖中合併業務邏輯。ASP.Net MVC優雅的UI和ModelBinder授權

但我仍然沒有找到一種優雅的方式來過濾使用當前用戶角色的UI組件(例如小部件,表單元素,表等),而不會污染具有業務邏輯的視圖。同樣適用於模型綁定。


表:產品創新

領域:

  • 名稱
  • 價格
  • 折扣

角色:

  • 角色管理員

    • 被允許查看和修改名稱字段
    • 被允許查看和修改價格字段
    • 被允許查看和修改th Ë折扣
  • 角色管理員助理

    • 被允許查看和修改名稱
    • 被允許查看和修改價格

Fields每個角色所顯示的都是不同的,也是01 「」需要忽略「管理員助理」角色discount field

你會怎麼做?

+0

你使用EditorFor()爲你的屏幕? – jfar 2010-04-29 16:06:46

+0

還沒有。我正在使用MVC 1(遷移計劃;)爲什麼? – SDReyes 2010-04-29 16:17:01

+2

因爲使用模板助手和模型元素更容易。 – jfar 2010-04-29 17:38:41

回答

1

由於您已經擁有當前用戶和訪問控制器中的授權提供者,因此這是他們的理想職責。在過濾了當前用戶有權訪問的小部件之後,使用一個天真的實現,可以將一組小部件傳遞給您的視圖。在您的表單字段的情況下,當您考慮客戶端驗證時,事情可能會變得多毛。

結合部將所有的最直接的,有針對這些特殊情況下會做的伎倆定製粘合劑特別好,因爲它不會訪問控制器上下文,你可以從那裏綁定抓住當前用戶根據您的角色定義的值。

+0

嗨,何塞,在MVC上下文中,我同意你在控制器上放置'UI'和'ModelBinding'邏輯。 (他們可以訪問我們需要的所有組件,除了這些情況下已經存在定製的ModelBinder)。好的方法+1 – SDReyes 2010-04-29 23:47:58

3

在途中,我可以這樣做是創建您自己的版本input extension methods。例如,而不是TextBox您可以創建TextBoxRoles並定義它像這樣:

public static MvcHtmlString TextBoxRoles(
    this HtmlHelper htmlHelper, 
    string name, 
    string RolesEdit, 
    string RolesView 
) 

然後在代碼中它是這樣的:

<%= Html.TextBoxRoles("Price", "Administrator","Administrator,Assistant") %> 

那麼你的TextBoxRoles實施將檢查當前的角色用戶通過User.IsInRole()確定頁面上應顯示的內容。

當然,您必須爲您使用的每種輸入擴展方法執行此操作。

+0

嗨Keltex,Good workaroud +1 !,儘管如此,使用這種方法,您仍然必須在視圖中定義授權角色:|。我想知道我們是否可以將所有這些邏輯轉移到其他層。你怎麼看? 再次感謝Keltex! :D – SDReyes 2010-04-29 15:25:39

1

LinFu,一個AOP框架呢?如果它是橫切的,那麼聲明它是這樣的,並將其視爲如此。

+0

嗨斯科特,AOP看起來像一個非常好的方法+1,謝謝!你的意思是,像攔截從助手渲染方法,並添加授權邏輯? – SDReyes 2010-04-29 17:40:27