我们知道,如果我们为基本类型定义模板,那么该模板也可以用于派生类型(如果没有使用任何其他模板来覆盖它)。
由于我们无法继承Enum
,因此enum
也不会继承Enum
,因此Enum.cshtml
中的Views\Shared\EditorTemplates
模板都不会对于对象的不同自定义枚举属性,它们不会处于活动状态,如下所示:
public enum Role
{
Admin,
User,
Guest
}
我已经在ASP中看到了关于这个主题的一些答案,但是我想知道在 MVC 4 中是否有一些关于这个主题的改进?
PS。我的意思是没有使用任何明确的模板归因(例如@Html.EditorFor(model => model.Role, "Enum")
或[UIHint("Enum")]
)
PPS。我是MVC的新手,所以我很感激你的答案。
答案 0 :(得分:7)
ķ。斯科特艾伦对此有一个很好的article。
答案 1 :(得分:1)
在MVC 5中,您可以向包含此代码的Views-> Shared-> EditorTemplates添加模板:
@model Enum
@{
var optionLabel = ViewData["optionLabel"] as string;
var htmlAttributes = ViewData["htmlAttributes"];
}
@Html.EnumDropDownListFor(m => m, optionLabel, htmlAttributes)
使用示例:
@Html.EditorFor(model => model.PropertyType,
new {
htmlAttributes = new { @class = "form-control" },
optionLabel = "Select"
})
在MVC 4中,你没有EnumDropDownListFor
扩展名,但是你可以自己动手,我之前就是这样做的:
public static MvcHtmlString DropDownListFor<TModel, TEnum>
(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TEnum>> expression,
string optionLabel = null, object htmlAttributes = null)
{
//This code is based on the blog - it's finding out if it nullable or not
Type metaDataModelType = ModelMetadata
.FromLambdaExpression(expression, htmlHelper.ViewData).ModelType;
Type enumType = Nullable.GetUnderlyingType(metaDataModelType) ?? metaDataModelType;
if (!enumType.IsEnum)
throw new ArgumentException("TEnum must be an enumerated type");
IEnumerable<SelectListItem> items = Enum.GetValues(enumType).Cast<TEnum>()
.Select(e => new SelectListItem
{
Text = e.GetDisplayName(),
Value = e.ToString(),
Selected = e.Equals(ModelMetadata
.FromLambdaExpression(expression, htmlHelper.ViewData).Model)
});
return htmlHelper.DropDownListFor(
expression,
items,
optionLabel,
htmlAttributes
);
}
参考文献:
http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum
答案 2 :(得分:0)
还有;有:
opensemanticsearch-delete --empty
角色当然是枚举:)