Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 下拉列表枚举使用AttributeDescription字段的ASP.NET MVC_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 下拉列表枚举使用AttributeDescription字段的ASP.NET MVC

Asp.net mvc 3 下拉列表枚举使用AttributeDescription字段的ASP.NET MVC,asp.net-mvc-3,Asp.net Mvc 3,根据这篇文章: 除了使用我的枚举中的AttributeDescription字段外,我希望执行完全相同的操作,例如: [DescriptionAttribute("1 Star")] OneStar = 1, [DescriptionAttribute("2 Stars")] TwoStar = 2, [DescriptionAttribute("3 Stars")] ThreeStar = 3, [DescriptionAttribute("4 Stars")] FourStar = 4 前

根据这篇文章:

除了使用我的枚举中的AttributeDescription字段外,我希望执行完全相同的操作,例如:

[DescriptionAttribute("1 Star")] OneStar = 1,
[DescriptionAttribute("2 Stars")] TwoStar = 2,
[DescriptionAttribute("3 Stars")] ThreeStar = 3,
[DescriptionAttribute("4 Stars")] FourStar = 4

前面链接中给出的解决方案将在下拉列表的文本字段中显示“一颗星”,而我希望看到“一颗星”。我看到过一些与此相关的帖子,但它们的解决方案相当冗长。

您可以尝试以下几行:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
    var enumType = typeof(TEnum);
    var fields = enumType.GetFields(
        BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
    );
    var values = Enum.GetValues(enumType).OfType<TEnum>();
    var items = 
        from value in values
        from field in fields
        let descriptionAttribute = field
            .GetCustomAttributes(
                typeof(DescriptionAttribute), true
            )
            .OfType<DescriptionAttribute>()
            .FirstOrDefault()
        let description = (descriptionAttribute != null)
            ? descriptionAttribute.Description 
            : value.ToString()
        where value.ToString() == field.Name
        select new { Id = value, Name = description };
    return new SelectList(items, "Id", "Name", enumObj);
}
public static SelectList to SelectList(此十进制枚举对象)
{
var enumType=typeof(TEnum);
var fields=enumType.GetFields(
BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
);
var values=Enum.GetValues(enumType).OfType();
可变项目=
从价值到价值
从田野到田野
让descriptionAttribute=字段
.GetCustomAttributes(
typeof(DescriptionAttribute),true
)
第()类
.FirstOrDefault()
let description=(descriptionAttribute!=null)
?描述属性。描述
:value.ToString()
其中value.ToString()==field.Name
选择新{Id=value,Name=description};
返回新的SelectList(项目“Id”、“名称”、enumObj);
}

我找到的最佳解决方案是与。这使得视图和模型都非常可读和可维护

查看我的

型号:

public enum YesPartialNoEnum
{
    [Description("Yes definitely")]
    Yes,
    [Description("No way!")]
    No
}

//........

[Display(Name = "The label for my dropdown list")]
public virtual Nullable<YesPartialNoEnum> CuriousQuestion{ get; set; }

//........

当没有Desc attr时,不是默认为value.ToString(),而是我的版本使用了字段。名称:let description=(descriptionAttribute!=null)?descriptionAttribute.description:field.Name.Replace(“\u”,”)
@Html.ValidationMessageFor(model => model.CuriousQuestion)