Enum的自定义编辑器模板 - 如何在“创建”视图中处理null?

时间:2015-07-15 23:08:07

标签: asp.net-mvc enums mvc-editor-templates

我正在尝试为枚举属性创建自定义编辑器模板。

我以为我做得很好。 Rob Lyndon helped me with a htmlHelper extension它在编辑视图中运行良好。

但是在Create视图中,它出错了,因为该值为null。

如果我将模型设为可空Enum?,那么我将无法获取填充选择列表的值。

我不想用默认值初始化所有模型。我想避免为每种类型的枚举创建不同的编辑器模板。

还有更好的选择吗?

的HtmlHelper

public static MvcHtmlString EnumTextDropDownListFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, Enum>> expression, Type enumType, object htmlAttributes)
{
    var enumValues = Enum.GetValues(enumType).OfType<Enum>().Select(v => v.ToString()).ToArray();
    var selectList = new SelectList(enumValues.Select(v => new SelectListItem { Text = v, Value = v }));
    return html.DropDownListFor(expression, selectList, htmlAttributes);
}

编辑模板

@model Enum

@{
    var htmlAttributesFromView = ViewData["htmlAttributes"] ?? new { };
    var htmlAttributes = Html.MergeHtmlAttributes(htmlAttributesFromView, new { @class = "form-control" });
    var type = Model.GetType();
}


<div class="form-group">
    @Html.LabelFor(model => model, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-8">

        @Html.EnumTextDropDownListFor(model => model, type, htmlAttributes)
        @Html.ValidationMessageFor(model => model)
    </div>
    <a class="infoonclick col-md-1" title="@Html.DisplayNameFor(model => model)" data-content="@Html.DescriptionFor(model => model)">
        <span class="fa fa-info-circle"></span>
    </a>
</div>

3 个答案:

答案 0 :(得分:2)

可能有点晚了,但我遇到了这个问题,这就是我解决它的方法:

@{
    var type = Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType)
               ?? ViewData.ModelMetadata.ModelType;
}

这将允许模型为null并避免nullref错误,否则您将尝试查询“null”模型的类型。

答案 1 :(得分:1)

我用

@model Enum

@Html.EnumDropDownListFor(model => model, new { @class = "form-control" })

Enum.cshtml视图中

答案 2 :(得分:0)

在最新的dotnet核心中,只需使用以下内容:

1-使模型动态化

@model dynamic

2-使用以下方法获取枚举类型:

var enumType = ViewData.ModelMetadata.UnderlyingOrModelType;

这将处理可空和不可空枚举