MVC中对Enum中的枚举项应用DisplayTemplates和EditorTemplates
本文介绍Enum中的枚举项应用DisplayTemplates和EditorTemplates
DisplayTemplates
现有枚举项如下,首先给每一项通过Display属性声明显示名称
public enum MyEnum : byte
{
[Display(Name = "Zéro")]
Zero,
[Display(Name = "Un")]
One,
[Display(Name = "Duex")]
Two,
[Display(Name = "Trois")]
Three,
[Display(Name = "Quatre")]
Four,
}
其次,在 Views/Shared/DisplayTemplates 文件夹下,新增Partial View
Enum.cshtml 应用: @Html.DisplayFor(model => model.MyEnum)
@model Enum
@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
// Display Enum using same names (from [Display] attributes) as in editors
string displayName = null;
foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model))
{
if (item.Selected)
{
displayName = item.Text ?? item.Value;
}
}
// Handle the unexpected case that nothing is selected
if (String.IsNullOrEmpty(displayName))
{
if (Model == null)
{
displayName = String.Empty;
}
else
{
displayName = Model.ToString();
}
}
@Html.DisplayTextFor(model => displayName)
}
else
{
// This Enum type is not supported. Fall back to the text.
@Html.DisplayTextFor(model => model)
}
EditorTemplates
在 Views/Shared/EditorTemplates 文件夹下,新增Partial View
Enum.cshtml 以select控件的方式加载,应用: @Html.EditorFor(model => model.MyEnum)
@model Enum
@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
@Html.EnumDropDownListFor(model => model, htmlAttributes: new { @class = "form-control" })
}
else
{
@Html.TextBoxFor(model => model, htmlAttributes: new { @class = "form-control" })
}
Enum-radio.cshtml 以radio-button控件的方式加载,应用: @Html.EditorFor(model => model.MyEnum, templateName: “Enum-radio”)
@model Enum
@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
// Provide radio buttons for current Enum value
string name = ViewData.ModelMetadata.PropertyName;
string id = Html.IdForModel().ToString();
int itemNum = 0;
foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model))
{
string myId = id + itemNum++.ToString();
string myChecked = item.Selected ? "checked" : null;
<label class="radio-inline">
<input type="radio" id="@(myId)" name="@(name)" value="@(item.Value)" checked="@(myChecked)" /> @(item.Text)
</label>
}
}
else
{
// This Enum type is not supported. Fall back to a text box.
@Html.TextBoxFor(model => model)
}
参考源码:ASP.NET-Source Code