2015-11-20 41 views
1

我的問題的DisplayAttribute是:我有一個枚舉類爲:MVC - 用枚舉在模型類

public enum EnumApplications 
{  
    Android = 1,   
    IOS = 2 
} 

另外我有一個模型,它是創建一個新用戶。當我們創建新用戶時,用戶可以在任何這些應用程序中被定義爲活動。

我的模式是:

public class NewUserModel 
{ 

    public int UserId { get; set; } 

    [Required] 
    [Display(Name = "FirstName")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "LastName")] 
    public string LastName { get; set; } 

    public int ClientId { get; set; } 

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

    [Display(Name = "Is Active in IOS")] 
    public bool IsActiveInApp1 { get; set; } 


    [Display(Name = "Is Active in Android")] 
    public bool IsActiveInApp2 { get; set; } 
} 

我想要做的就是在:[Display(Name = "Is Active in Android")]

我想用枚舉,所以如果應用程序名稱得到改變,我不需要去改變它這裏,是這樣的:

EnumApplications.IOS.ToString() 

這裏有一個更好的理解截圖:

+2

你不能那樣做。除非您創建自己的自定義DisplayAttribute,這沒有任何意義。只需在視圖中使用枚舉。 – ataravati

+0

你正試圖做什麼?將實例數據嵌入到屬性中? –

+0

有意義,謝謝 –

回答

1

「我想用枚舉,所以如果應用程序名稱得到改變,我不需要在此處更改」

沒有,有沒有簡單的方法來做到這一點。

我能想到的唯一實現(除了運行時的彙編/類型編譯和生成),你可以做到這一點,是一個T4模板。該模板將生成模型,並且在修改enum之後,您將不得不運行它。 - 使用枚舉在模型類的DisplayAttribute

我想是在我的模型,而不是說[顯示(

MVC:


在問候你的問題標題和評論

名稱=「在IOS中處於活動狀態」)]和硬編碼IOS。我想從我的枚舉中獲得IOS的名稱。

以下溶液(其不是T4或運行時編譯)只是繼承DisplayNameAttribute和使用您的類型的構造的參數傳遞到基本類型。

正是在這個意義上,如果你要改變AndroidAndy你可以使用一個重構工具(內置智能感知工具,這些天),實現跨越代碼文件更改,引用值類型的解決方案。

public enum MyEnum 
{ 
    NotSet = 0, 
    iOS = 1, 
    Android = 2 
} 

class MyDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute 
{ 
    public MyDisplayNameAttribute(MyEnum myEnum) 
     : base("Is Active in " + myEnum.ToString()) 
    { 

    } 

    public override string DisplayName 
    { 
     get 
     { 
      // you could do the "Is Active in " here, but I doubt control frameworks would use it. 
      return base.DisplayName;     
     } 
    }   
} 

public class MyModel 
{ 
    [MyDisplayName(MyEnum.iOS)] 
    bool IsActiveApp1 { get; set; } 

    // uses standard 'DisplayNameAttribute' type for test below 
    [System.ComponentModel.DisplayName("Is Active in Android")] 
    bool IsActiveApp2 { get; set; } 
} 

爲了快速測試,我們會做什麼控制框架做的,反映了所提供的類型,並獲得CustomAttribute ..請注意,有更多的類型檢查參與,我們將它轉​​到DisplayNameAttribute贅述。

string[] PropertyNames = new string[] { "IsActiveApp1", "IsActiveApp2" }; 
System.Type MyModelInfo = typeof(MyModel); 

PropertyNames.SelectMany(prop => MyModelInfo.GetProperty(prop).GetCustomAttributes(true)) 
    .ToList().ForEach((attr) => 
     { 
      Console.WriteLine(((System.ComponentModel.DisplayNameAttribute)attr).DisplayName); 
     }); 
+1

不是一個好主意。 – ataravati

+1

我認爲OP需要從db/session或其存儲位置動態獲取客戶屬性中的應用程序名稱。否則爲什麼他不能直接放一些'const'(常量)並完成工作? –

+0

@SivaGopal也許這些值從數據庫/會話或任何..填充,但這實在沒有什麼關係如何通過控件顯示名稱.. –