我正在尝试为枚举属性创建自定义编辑器模板。
我以为我做得很好。 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>
答案 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;
这将处理可空和不可空枚举