在Share/EditorTemplates中新增View,名为Enum.cstml
内容如下
1 @using MvcApp.Infrastructure
2 @model Enum
3
4 @Html.DropDownListFor(m => m, Enum.GetValues(Model.GetType())
5 .Cast<Enum>()
6 .Select(m => {
7 string enumVal = Enum.GetName(Model.GetType(), m);
8 return new SelectListItem()
9 {
10 Selected = (Model.ToString() == enumVal),
11 Text = m.EnumMetadataDisplay(),
12 Value = enumVal
13 };
14 }))
设计枚举类型的扩展方法EnumMetadataDisplay
1 public static class EnumExtension
2 {
3 public static string EnumMetadataDisplay(this Enum value)
4 {
5 var attribute = value.GetType().GetField(Enum.GetName(value.GetType(),value)).GetCustomAttributes(
6 typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),false)
7 .Cast<System.ComponentModel.DataAnnotations.DisplayAttribute>()
8 .FirstOrDefault();
9 if (attribute != null)
10 {
11 return attribute.Name;
12 }
13
14 return Enum.GetName(value.GetType(), value);
15 }
16 }
为枚举值加上DisplayAttribute的特性标注
1 public enum Role
2 {
3 [Display(Name = "管理员")]
4 Admin,
5 [Display(Name = "用户")]
6 User,
7 [Display(Name = "来宾")]
8 Guest
9 }
为视图模型类的源数据类设置枚举字段的编辑方式
1 [DisplayName("Person Details")]
2 public class PersonMetadata
3 {
4 [HiddenInput(DisplayValue=false)]
5 [ScaffoldColumn(false)]
6 public int PersonId
7 {
8 get;
9 set;
10 }
11 [Display(Name="生日",Prompt="yyyy-MM-dd" )]
12 [DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)]
13 [DataType(DataType.Date)]
14 public DateTime BirthDate
15 {
16 get;
17 set;
18 }
19 [UIHint("MultilineText")]
20 public string FirstName
21 {
22 get;
23 set;
24 }
25 [UIHint("Enum")]
26 public Role Role { get; set; }
27 [AdditionalMetadata("RenderList",true)]
28 public bool IsApproved
29 {
30 get;
31 set;
32 }
33 }
34 [MetadataType(typeof(PersonMetadata))]
35 public partial class Person
36 {
37 }