2017-06-19 1 views
0

EnumDropDownListFor l'aide HTML de MVC ne rend pas Description et attributs ShortName. J'avais besoin de textes d'attributs personnalisés pour les balises d'option rendues. Je cherchai beaucoup de ne pas ré-écrire tout à propos de MVC, mais je ne pouvais pas trouver.Enumdropdownlistfor extension pour les champs de description et ShortName

Je sais MVC est très différent en dehors de WebForms mais, MVC aurait dû prévoir un moyen permettant de personnaliser le mécanisme renderin.

Répondre

0

Sur la base de mes recherches, j'ai besoin de lire tous les membres de type Enum puis, réécrivez mécanisme contenant validation rendu d'. La pire option pour modifier le code html de la méthode de base consistait à utiliser regex. Le code de résultat ressemble à ci-dessous:

public static MvcHtmlString EnumDropDownListForEx<T, TProperty>(this HtmlHelper<T> htmlHelper, Expression<Func<T, TProperty>> expression, 
     object htmlAttributes, string placeholder = "") 
    { 
     var type = Nullable.GetUnderlyingType(typeof(TProperty)) ?? typeof(TProperty); 
     var values = Enum.GetValues(type); 

     var name = ExpressionHelper.GetExpressionText(expression); 
     var fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 

     var select = new TagBuilder("select"); 
     select.MergeAttribute("name", fullHtmlFieldName); 
     select.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 

     var option = new TagBuilder("option"); 
     option.MergeAttribute("value", ""); 
     option.MergeAttribute("selected", "selected"); 
     option.InnerHtml = placeholder; 

     var sb = new StringBuilder(); 
     sb.Append(option.ToString(TagRenderMode.Normal)); 

     foreach (Enum value in values) 
     { 
      option = new TagBuilder("option"); 
      option.MergeAttribute("value", value.ToInt().ToString()); 
      option.InnerHtml = value.GetEnumDescription(); 

      var attr = value.GetAttribute<DisplayAttribute>(); 
      if(attr == null) 
       continue; 

      option.InnerHtml = attr.Name; 
      option.MergeAttribute("description", attr.Description); 
      option.MergeAttribute("shortname", attr.ShortName); 
      sb.Append(option.ToString(TagRenderMode.Normal)); 
     } 

     select.InnerHtml = sb.ToString(); 
     select.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name)); 

     return MvcHtmlString.Create(select.ToString(TagRenderMode.Normal)); 
    }