2012-01-09 25 views
9

Im sử dụng một đoạn mã từ một câu hỏi khác stackoverflow:Sử dụng [Hiển thị (Tên = "X")] với enum. HtmlHelper tùy chỉnh trong MVC3 ASP.Net

namespace MvcHtmlHelpers 
{ 
    public static class htmlHelpers 
    { 
     /// <summary> 
     /// Radio button for : Adapted to support enum labels from display attributes 
     /// </summary> 
     /// <typeparam name="TModel"></typeparam> 
     /// <typeparam name="TProperty"></typeparam> 
     /// <param name="htmlHelper"></param> 
     /// <param name="expression"></param> 
     /// <returns></returns> 
     public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
      this HtmlHelper<TModel> htmlHelper, 
      Expression<Func<TModel, TProperty>> expression 
     ) 
     { 
      var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
      var names = Enum.GetNames(metaData.ModelType); 
      var sb = new StringBuilder(); 
      foreach (var name in names) 
      { 
       var id = string.Format(
        "{0}_{1}_{2}", 
        htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, 
        metaData.PropertyName, 
        name 
       ); 

       var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString(); 
       sb.AppendFormat(
        "<label for=\"{0}\">{1}</label> {2}", 
        id, 
        HttpUtility.HtmlEncode(name), 
        radio 
       ); 
      } 
      return MvcHtmlString.Create(sb.ToString()); 
     } 
    } 
} 

Cùng đội hình hiện tại enum tôi:

public enum Options 
    { 
     [Display(Name ="Yes")] 
     0, 
     [Display(Name = "No")] 
     1, 
     [Display(Name = "Other")] 
     2, 
    } 

Nếu tôi sau đó sử dụng @html.RadioButtonForEnum(...) Nó hiển thị enums của tôi với hộp thích hợp đã chọn không có vấn đề gì. Tuy nhiên, tôi muốn họ sử dụng giá trị nhãn [Display(Name = "<text>")] để chúng có ý nghĩa hơn! - tức là không chỉ 0,1,2.

Trả lời

12

Bạn có thể sử dụng phản ánh để lấy giá trị:

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression 
) 
{ 
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

    var sb = new StringBuilder(); 
    var enumType = metaData.ModelType; 
    foreach (var field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)) 
    { 
     var value = (int)field.GetValue(null); 
     var name = Enum.GetName(enumType, value); 
     var label = name; 
     foreach (DisplayAttribute currAttr in field.GetCustomAttributes(typeof(DisplayAttribute), true)) 
     { 
      label = currAttr.Name; 
      break; 
     } 

     var id = string.Format(
      "{0}_{1}_{2}", 
      htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, 
      metaData.PropertyName, 
      name 
     ); 
     var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString(); 
     sb.AppendFormat(
      "<label for=\"{0}\">{1}</label> {2}", 
      id, 
      HttpUtility.HtmlEncode(label), 
      radio 
     ); 
    } 
    return MvcHtmlString.Create(sb.ToString()); 
} 
+0

này hoạt động một điều trị, tiếc là tôi không nhận được giá trị được chọn tự động nữa mặc dù: '@ Html.RadioButtonForEnum (m => m.Options)' – JustAnotherDeveloper

+0

@RawryLions, đúng vậy, tôi đã cập nhật câu trả lời của mình để sửa lỗi này. Nó sẽ hoạt động như mong đợi. –

+0

công cụ tuyệt vời, cảm ơn sự giúp đỡ. Bây giờ tôi có thể sử dụng điều này làm cơ sở để tạo ra enum cho các phần tử biểu mẫu khác nữa :) – JustAnotherDeveloper

0

Bạn có thể cần một phương pháp mở rộng cho enum của bạn để có được thuộc tính hiển thị mà bạn đặt trên các tùy chọn enum của bạn. Sau đó, khi bạn nhận được tên hoặc giá trị của giá trị enum tùy chọn của bạn trong phương pháp RadioButtonForEnum bạn sẽ chỉ gọi phương thức mở rộng để điền vào giá trị.

Gần đây tôi đã viết một bài đăng blog về chủ đề này: http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

Hope this helps.

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