MVC - 在Model类的DisplayAttribute中使用枚举

时间:2015-11-20 19:45:13

标签: c# asp.net-mvc enums

我的问题是:我有一个枚举类:

extension NSDate
{
    func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
    {
        if self.compare(beginDate) == .OrderedAscending
        {
            return false
        }

        if self.compare(endDate) == .OrderedDescending
        {
            return false
        }

        return true
    }
}

我还有一个用于创建新用户的模型。在我们创建新用户时,可以在任何这些应用程序中将用户定义为“活动”。

我的模特是:

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")]

以下是更好理解的屏幕截图:

1 个答案:

答案 0 :(得分:1)

  

“我想使用枚举,所以如果应用名称发生变化,我不需要在这里更改”

不,没有简单的方法可以做到这一点。

我能想到的唯一实现(除了运行时汇编/类型编译和生成),你可以做到这一点,是一个T4模板。模板会生成模型,您必须在修改enum后运行它。

关于你的问题标题和评论:

  

MVC - 在Model类的DisplayAttribute中使用Enum

     

我想要的是在我的模型中,而不是说[显示(名称=“在IOS中是活动的”)]和硬编码IOS。我想从我的枚举中获取IOS的名称。

以下解决方案(不是T4或运行时编译)只是继承DisplayNameAttribute并使用您的类型的构造函数将参数传递给基类型。

这是一个解决方案,如果您要将Android更改为Andy,您将使用重构工具(最近内置的智能感知工具)来实现跨代码文件的更改引用该值类型。

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);
        });