2017-06-19 53 views
0

MVC的EnumDropDownListFor html帮助器不会呈现Description和ShortName属性。我需要渲染选项标签的自定义属性文本。我搜查了很多不是重写MVC中的所有内容,但我找不到任何内容。Enumdropdownlist用于扩展描述和短名称字段

我知道MVC与WebForms不同,但MVC应该提供了一种自定义渲染机制的方法。

回答

0

基于我的搜索,我首先需要读取Enum类型的所有成员,然后重写包含验证的渲染机制。修改基本方法的html最糟糕的选择是使用正则表达式。结果代码如下:

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)); 
    }