【问题标题】:Creating a radiobutton list for Enums that can be nullable为可以为空的枚举创建单选按钮列表
【发布时间】:2015-08-04 18:43:47
【问题描述】:

我有以下代码成功地将 Enum 转换为单选按钮列表。但是,如果 Enum 可以为空,则它不起作用。是否可以允许为空的枚举?

public static MvcHtmlString EnumRadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

        var listOfValues = Enum.GetNames(metaData.ModelType);  //<--- It errors here if the enum is nullable

        var sb = new StringBuilder();

        if (listOfValues != null)
        {             
            sb = sb.AppendFormat(@"<span class=""radio"">");

            // Create a radio button for each item in the list
            foreach (var name in listOfValues)
            {
                var label = name;

                var memInfo = metaData.ModelType.GetMember(name);

                if (memInfo != null)
                {
                    var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);

                    if (attributes != null && attributes.Length > 0)
                        label = ((DisplayAttribute)attributes[0]).Name;
                }

                var id = string.Format(
                    "{0}_{1}_{2}",
                    htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
                    metaData.PropertyName,
                    name
                );

                int enumValue = (int)Enum.Parse(metaData.ModelType, name);

                var radio = htmlHelper.RadioButtonFor(expression, enumValue, new { id = id }).ToHtmlString();

                sb.AppendFormat(@"<label for=""{0}"">{1}{2}</label><br />", id, radio, label);
            }

            sb = sb.AppendFormat("</span>");
        }

        return MvcHtmlString.Create(sb.ToString());
    }

我在代码中注意到的那行错误是这样的:

提供的类型必须是枚举。参数名称:枚举类型

这就是我使用 MVC 实现它的方式:

类:

    public enum IdTypes
    {
        [Display(Name="Driver's License")]
        DriversLicense = 1,
        [Display(Name="State ID")]
        StateID = 2,
        [Display(Name="US Passport")]
        UsPassport = 3,
        [Display(Name="Green Card")]
        GreenCard = 4
    }

    [Display(Name="Photo ID Provided")]
    [UIHint("EnumRadioButtonListFor")]
    public IdTypes? PhotoIDProvidedSecondary { get; set; }

剃须刀:

    <div class="form-group">
        @Html.LabelFor(model => model.PhotoIDProvidedSecondary, htmlAttributes: new { @class = "control-label col-md-3" })
        <div class="col-md-2">
            @Html.EditorFor(model => model.PhotoIDProvidedSecondary, new { htmlAttributes = new { @class = "form-control" } })
        </div>
        <div class="col-md-4">
            <p class="form-control-static">@Html.ValidationMessageFor(model => model.PhotoIDProvidedSecondary, "", new { @class = "text-danger" })</p>
        </div>
    </div>

EditorTemplate (EnumRadioButtonListFor):

@model Enum
@using BrokerDealer.Extensions

@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
    @Html.EnumRadioButtonListFor(model => model)
}
else
{
    @Html.TextBoxFor(model => model, htmlAttributes: new { @class = "form-control" })
}

【问题讨论】:

    标签: c# asp.net-mvc enums


    【解决方案1】:

    我暂时无法测试,但如果你改行失败:

    var myEnum = Nullable.GetUnderlyingType(metaData.ModelType) ?? metaData.ModelType;
    var listOfValues = Enum.GetNames(myEnum);
    

    你应该得到你期望的结果。

    【讨论】:

    • 我只需要在函数中用 myEnum 替换 metaData.ModelType 的所有实例,它就像一个魅力!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多