2011-04-26 35 views
1

我有一個模型類,它具有AreDuesPaid屬性,我只希望管理員能夠查看和編輯該屬性。除非用戶角色是管理員,否則防止自動構建屬性?

類看起來是這樣的:

public class ClubMember 
{ 
    [ScaffoldColumn(false)] 
    public int Id { get; set; } 

    [Display(Name = "First Name")] 
    [Required(ErrorMessage = "First name is required")] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [Required(ErrorMessage = "Last name is required")] 
    public string LastName { get; set; } 

    [Display(Name = "Email Address")] 
    [DataType(DataType.EmailAddress)] 
    public string EmailAddress { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    [Display(Name = "Phone Number")] 
    public string PhoneNumber { get; set; } 

    [Authorize(Roles="Administrator")] // error: this can only be used for methods 
    public bool AreDuesPaid{ get; set; } 
} 

我想也許我可以用Authorize屬性,但編譯器告訴我這僅僅是方法。

所以,我想知道,如何使用DisplayForModel()EditorForModel()來自動支架視圖時如何限制對特定屬性的訪問?

我需要建立完全獨立的觀點和看法模型或有更簡單的方法嗎?

回答

1

這裏是我結束了去瞭解決方案:

  1. 使用視圖模型,而不是模型。所以,在這種情況下,我創建了一個名爲ViewModels.ClubMember.EditorModel的類。
  2. 對於任何屬於管理員的屬性,請將它們放在單獨的類中。在這種情況下,ViewModels.ClubMember.AdminEditorModel
  3. AdminEditorModelEditorModel的屬性。
  4. 當請求EditorModel,即獲得該模型的服務檢查登錄用戶的憑據。如果用戶是管理員,則填充AdminEditorModel屬性,否則將其設置爲空。
  5. 在視圖中,使用EditorForModel()來渲染EditorModel,然後,如果AdminEditorModel不爲空,請使用EditorFor(model => model.AdminEditorModel)來支撐剩餘的屬性。 (注:AdminEditorModel不會自動做腳手架時EditorForModel()因爲默認object模板專門忽略複雜性。)

這花了一些工作來實現,但到目前爲止,我發現這是一個相當乾淨解。它似乎也與驗證一起工作得很好。

更新基於一些對衰退的答案評論

(尤其是丹尼的),我決定肯定東西多一點通過使用管理員與普通用戶完全不同的頁面。每個頁面都有自己的視圖模型(EditorModelAdminEditorModel)。這需要更多的工作,然後我的初始解決方案(我不得不添加新的動作到我的控制器,並添加視圖模型和模型之間的映射,但最終的結果是另一個層次更清潔,並且絕對更安全

1

它dosent,應使房產權限限制。相反,您應檢查呈現視圖時是否已登錄的用戶具有「管理員」角色(在視圖中組成一些if語句,因此如果用戶在角色「管理員」中,則顯示AreDuesPaid的值,否則隱藏)

+0

但我認爲這使得它不可能使用'DisplayForModel()'和'EditorForModel()'。 – devuxer 2011-04-26 20:24:20

+1

我還必須非常小心在視圖中隱藏的東西,因爲惡意用戶可能仍然張貼從「保護」性能數據並將它們寫入您的課程在保存之前。權限不屬於UI代碼。 – 2011-04-28 15:34:27

+0

@丹尼,你得詳細解釋一下。 HttpPost的'ActionResult'通常用'[Authorize]'屬性修飾,或者是一個自定義的屬性,它允許你指定哪些角色應該被允許調用'ActionResult'。 – ebb 2011-05-03 18:22:22

相關問題