2012-01-09 6 views
9

इम में कस्टम HtmlHelper एक और stackoverflow सवाल से कोड का एक टुकड़ा का उपयोग कर:एक प्रदर्शन के साथ [प्रदर्शन (नाम = "एक्स")] का उपयोग करना। 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()); 
     } 
    } 
} 

ओर मेरे वर्तमान enum साथ:

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

अगर मैं तो @html.RadioButtonForEnum(...) का उपयोग यह साथ मेरे enums प्रदर्शित करता है उचित बॉक्स में कोई समस्या नहीं है। हालांकि, मैं चाहता हूं कि वे लेबल मान [Display(Name = "<text>")] का उपयोग करें ताकि वे अधिक समझ सकें! - यानी सिर्फ 0,1,2 नहीं।

उत्तर

12

आप मूल्य लाने के लिए प्रतिबिंब इस्तेमाल कर सकते हैं:

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

यह एक का इलाज काम करता है, दुर्भाग्यवश मुझे अब एक ऑटो चयनित मूल्य नहीं मिल रहा है: '@ एचटीएमएल। रैडियोबटन फोरएनम (एम => एम। ऑप्शन)' – JustAnotherDeveloper

+0

@RawryLions, ठीक है, मैंने इसे ठीक करने के लिए अपना जवाब अपडेट कर दिया है। यह अब उम्मीद के रूप में काम करना चाहिए। –

+0

शानदार सामान, मदद के लिए धन्यवाद। अब मैं इसे अन्य रूप तत्वों के लिए enum बनाने के लिए आधार के रूप में उपयोग कर सकते हैं :) – JustAnotherDeveloper

0

आपको अपने एनम विकल्पों पर डालने वाले प्रदर्शन विशेषता को प्राप्त करने के लिए शायद आपके विस्तार के लिए एक एक्सटेंशन विधि की आवश्यकता है। फिर जब आपको रेडियोबटन फॉरएनम विधि में आपके विकल्प एनम मान का नाम या मूल्य मिलता है तो आप मूल्य को भरने के लिए केवल एक्सटेंशन विधि को कॉल करेंगे। http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

आशा इस मदद करता है:

मैं हाल ही में इस विषय के बारे में एक ब्लॉग पोस्ट में लिखा था।

0

मैं अपने कोड में [Description] उपयोग करें, लेकिन आप बस उस DisplayAttribute उपयोग करने के लिए बदल सकते हैं:

https://gist.github.com/1287511

संबंधित मुद्दे