2010-08-19 30 views
18

Cách được khuyến nghị để hiển thị các thuộc tính enum cục bộ trong MVC2 là gì?Hiển thị các giá trị enum địa phương hóa thân thiện, sử dụng DataAnnotations trong ASP.NET MVC2

Nếu tôi có một mô hình như thế này:

public class MyModel { 
    public MyEnum MyEnumValue { get; set; } 
} 

và một dòng trong giao diện như thế này:

<%: Html.DisplayFor(model => model.MyEnumValue) %> 

Tôi đã hy vọng để chỉ chú thích các giá trị enum với DisplayAttribute như thế này:

public enum MyEnum 
{ 
    [Display(Name="EnumValue1_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue1, 
    [Display(Name="EnumValue2_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue2, 
    [Display(Name="EnumValue3_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue3 
} 

Điều đó không được hỗ trợ. Có vẻ như có một thứ khác cần thiết. Cách tốt nhất để thực hiện nó là gì?

+0

Bạn muốn hiển thị kết quả cuối cùng như thế nào? – madcapnmckay

+0

Bản dịch thích hợp từ tệp tài nguyên, tức là EnumValue1_Name, v.v. –

+0

hãy xem câu hỏi này có thể hữu ích! http://stackoverflow.com/questions/3431515/in-asp-net-mvc-can-i-make-a-default-editor-template-for-enum –

Trả lời

7

Bạn có thể thử sử dụng DescriptionAttribute cho việc này.

Ví dụ:

Trong mô hình điểm:

public enum MyEnum 
     { 
      [Description("User Is Sleeping")] 
      Asleep, 
      [Description("User Is Awake")] 
      Awake 
     } 

public string GetDescription(Type type, string value) 
     { 
      return ((DescriptionAttribute)(type.GetMember(value)[0].GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description; 
     } 

Trong giao diện:

Model.GetDescription(Model.myEnum.GetType(), Model.myEnum) to retrieve the value set in Description. 

Tôi đang sử dụng một cái gì đó tương tự để thiết lập DisplayName và giá trị trong Html.Dropdown tôi.

+1

Chắc chắn, nhưng điều đó không được bản địa hoá. Và quan điểm cần phải biết liệu chúng có hiển thị một Enum hay cái gì khác không, và tôi hy vọng sẽ tách mối quan tâm đó ra. Tôi đã hy vọng sẽ mở rộng ModelMetadataProvider hoặc một cái gì đó như thế. Tôi sẽ đăng câu trả lời nếu tôi tìm thấy nó. –

+1

Có, bạn đã đúng. Điều này sẽ không hoạt động để yêu cầu bản địa hóa lại. Tôi sẽ giữ cho bài đăng mặc dù. Một số người có thể thấy nó hữu ích cho các tình huống khác. –

+1

Vâng, tôi thấy nó hữu ích, cảm ơn. – empo

3

Tôi cũng sử dụng chú thích Hiển thị. Đây là những gì tôi đã kết thúc bằng cách sử dụng, mà làm việc cho cả một tài sản và các thành viên enum.

Dưới đây là enum của tôi:

public enum TagOrderStatus 
{ 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_NotOrdered")] 
    NotOrdered = 0, 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_ToOrder")] 
    ToOrder = 1, 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_Ordered")] 
    Ordered = 2 
} 

Sau đó ít do-it-tất cả các phương pháp hữu ích của tôi:

public static string GetLocalizedDisplay<TModel>(string pPropertyName) 
{ 
    DisplayAttribute attribute; 

    if (typeof(TModel).IsEnum) 
    { 
     MemberInfo member = typeof(TModel).GetMembers().SingleOrDefault(m => m.MemberType == MemberTypes.Field && m.Name == pPropertyName); 
     attribute = (DisplayAttribute)member.GetCustomAttributes(typeof(DisplayAttribute), false)[0]; 
    } 
    else 
    { 
     PropertyInfo property = typeof(TModel).GetProperty(pPropertyName); 
     attribute = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), true)[0]; 
    } 

    if (attribute.ResourceType != null) 
     return new ResourceManager(attribute.ResourceType).GetString(attribute.Name); 
    else 
     return attribute.Name; 
} 

này sau đó có thể được sử dụng cách này để có được một tài sản hiển thị thành viên duy nhất cho một enum thành viên:

string disp = GetLocalizedDisplay<Tag.TagOrderStatus>("Ordered"); 

Hoặc thuộc tính:

string disp = GetLocalizedDisplay<Tag>("OwnerName"); 

Tôi yêu Generics. Hi vọng điêu nay co ich!!

Các vấn đề liên quan