2

我使用數據註釋和一些自定義模板生成了很多視圖。我可以根據條件顯示/隱藏包含數據註釋的視圖模型元素嗎?

public class Container 
{ 
    [HiddenInput(DisplayValue = false)] 
    public string Key { get; set; } 

    [Display(Name = "Full Name")] 
    [RequiredForRole("Editor"), StringLength(30)] 
    public string Name { get; set; } 

    [Display(Name = "Short Name")] 
    [RequiredForRole("Editor"), StringLength(10)]  
    public string ShortName { get; set; } 

    [Display(Name="Maximum Elements Allowed")] 
    [RequiredForRole("Admin")] 
    public int MaxSize { get; set; } 

    [Display(Name = "Components")] 
    public IList<Component> Components{ get; set; } 
} 

在的意見,我只是用@Html.DisplayForModel()@Html.EditorForModel

某些屬性必須以某種角色的用戶可編輯的,但隱藏了別人。正如你所看到的,我已經實現了一個自定義驗證屬性RequiredForRole,它檢查一個值是否存在,但是隻有當前用戶具有某個角色。

我確實需要一個自定義顯示屬性,但由於DisplayAttribute是密封的,這似乎不可能。

我想避免針對不同類型的用戶有很多不同的模板,或者開始推動誰能看到什麼看到視圖的邏輯。解決這個問題的最好方法是什麼?

+0

在您的自定義模板,您使用DisplayFor或EditorFor助手? –

+0

@RaphaëlAlthaus是的,但我沒有許多模型類型的自定義模板 - 他們只是使用標準的'生成'模板。 –

回答

3

也許是這樣的。該(BIG)的問題是:如何檢查當前用戶的角色......

public class VisibleForRoleAttribute : Attribute, IMetadataAware 
    { 
     public string[] Roles { get; set; } 
     public VisibleForUserAttribute(string[] roles) 
     { 
      Roles = roles; 
     } 
     public void OnMetadataCreated(ModelMetadata metadata) 
     { 
      var toShow = Roles.Any(IsUserInRole); 
      metadata.ShowForDisplay = metadata.ShowForEdit = toShow; // or just ShowForEdit 

     } 
     private bool IsUserInRole(string roleName) 
     { 
      return HttpContext.Current != null && 
        HttpContext.Current.User != null && 
        HttpContext.Current.User.IsInRole(roleName); //if you use MembershipProvider 
     } 
    } 

使用

[VisibleForRole(new[]{"Administrator", "Editor"})] 
+0

我從來沒有見過'IMetadataAware'。這將是非常有用的。非常感謝,Raphaël! –

相關問題