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

问题描述 投票:2回答:3

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

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

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

如果我使模型可以为nazlable 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>
asp.net-mvc enums mvc-editor-templates
3个回答
2
投票

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

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

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


1
投票

我用

@model Enum

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

在我的Enum.cshtml视图中


0
投票

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

1-使模型动态化

@model dynamic

2-获取枚举类型:

var enumType = ViewData.ModelMetadata.UnderlyingOrModelType;

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

© www.soinside.com 2019 - 2024. All rights reserved.