Using [Display(Name = “X”)] with an enum. Custom HtmlHelper in MVC3 ASP.Net

前端 未结 3 2546
余生分开走
余生分开走 2021-02-20 16:31

Im using a snippet of code from another stackoverflow question:

namespace MvcHtmlHelpers
{
    public static class htmlHelpers
    {
        /// 
         


        
相关标签:
3条回答
  • 2021-02-20 16:57

    You could use reflection to fetch the value:

    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 讨论(0)
  • 2021-02-20 17:10

    I use [Description] in my code, but you can simply change that to use DisplayAttribute:

    https://gist.github.com/1287511

    0 讨论(0)
  • 2021-02-20 17:18

    You probably need an extension method for your enum to get the display attribute that you put on your enum options. Then when you get the name or value of your options enum value in the RadioButtonForEnum method you would just call the extensions method to fill up the value.

    I recently wrote a blog post about this topic: http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

    Hope this helps.

    0 讨论(0)
提交回复
热议问题