加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用[Display(Name =“X”)]和枚举. MVC3 ASP.Net中的自定

发布时间:2020-12-15 04:19:56 所属栏目:百科 来源:网络整理
导读:我使用另一个stackoverflow问题的一段代码: namespace MvcHtmlHelpers{ public static class htmlHelpers { /// summary /// Radio button for : Adapted to support enum labels from display attributes /// /summary /// typeparam name="TModel"/typepa
我使用另一个stackoverflow问题的一段代码:
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());
        }
    }
}

沿着我目前的枚举:

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

如果我然后使用@ html.RadioButtonForEnum(…)它显示我的枚举与相应的框选择没有问题.但是,我希望他们使用标签值[Display(Name =“< text>”)],以使它们更有意义!即不仅仅是0,1,2.

解决方法

您可以使用反射来获取值:
public static MvcHtmlString RadioButtonForEnum<TModel,TProperty>(
    this HtmlHelper<TModel> htmlHelper,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}",name
        );
        var radio = htmlHelper.RadioButtonFor(expression,new { id = id }).ToHtmlString();
        sb.AppendFormat(
            "<label for="{0}">{1}</label> {2}",HttpUtility.HtmlEncode(label),radio
        );
    }
    return MvcHtmlString.Create(sb.ToString());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读