2012-01-09 6 views
9

Im usando un frammento di codice da un'altra domanda StackOverflow:Utilizzo di [Visualizza (Nome = "X")] con enum. HtmlHelper personalizzato in 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()); 
     } 
    } 
} 

Lungo il lato la mia attuale enum:

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

Se Ho quindi utilizzare @html.RadioButtonForEnum(...) Esso mostra le mie enumerazioni con la casella appropriata selezionata nessun problema. Tuttavia, voglio che usino il valore dell'etichetta [Display(Name = "<text>")], quindi hanno più senso! - non solo 0,1,2.

risposta

12

Si potrebbe utilizzare la reflection per recuperare il valore:

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

Questo funziona a meraviglia, sfortunatamente non ho più un valore selezionato automaticamente: '@ Html.RadioButtonForEnum (m => m.Options)' – JustAnotherDeveloper

+0

@RawryLions, giusto, ho aggiornato la mia risposta per risolvere questo problema. Dovrebbe funzionare ora come previsto. –

+0

cose fantastiche, grazie per l'aiuto. Ora posso usare questo come base per creare enum anche ad altri elementi del modulo :) – JustAnotherDeveloper

0

Probabilmente hai bisogno di un metodo di estensione per il tuo enum per ottenere l'attributo di visualizzazione che hai messo sulle tue opzioni enum. Quindi, quando ottieni il nome o il valore del valore dell'enumerazione delle opzioni nel metodo RadioButtonForEnum, devi semplicemente chiamare il metodo estensioni per riempire il valore.

Recentemente ho scritto un post su questo argomento: http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

Spero che questo aiuti.

Problemi correlati