【问题标题】:Enumdropdownlistfor extending for description and shortname fields用于扩展描述和短名称字段的 Enumdropdownlist
【发布时间】:2017-06-19 19:17:52
【问题描述】:

MVC 的 EnumDropDownListFor html 助手不呈现 Description 和 ShortName 属性。我需要渲染选项标签的自定义属性文本。我进行了很多搜索以不重新编写有关 MVC 的所有内容,但我找不到任何内容。

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 html-helper


    【解决方案1】:

    根据我的搜索,我首先需要读取 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));
        }
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多