我为我的一个枚举使用了[Display]
属性:
public enum eCommentType
{
[Display(ResourceType = typeof(FaultManagementStrings), Name = "NormalComment")]
NormalComment = 0,
[Display(ResourceType = typeof(FaultManagementStrings), Name = "OpenningComment")]
OpenningComment = 1,
[Display(ResourceType = typeof(FaultManagementStrings), Name = "StartProgressComment")]
StartProgressComment = 2,
[Display(ResourceType = typeof(FaultManagementStrings), Name = "ClouserComment")]
ClouserComment = 3,
[Display(ResourceType = typeof(FaultManagementStrings), Name = "ReopennignComment")]
ReopennignComment = 4
}
是否有可能创建一个扩展方法来重用现有的MVC功能,从指定的资源中获取显示属性值?
我想做一些类似的事情…
@Html.GetEnumDisplayAttributeValue(c=> comment.CommentType)
我知道我可以写一些东西来实现所需的反射,并找到资源类型的值和调用资源管理器等等……但我认为,也许有可能使用现有的内置功能mvc..毕竟,当您调用LabelFor
helper时,它已经完成了。
这是可能的还是我应该重新发明轮子
我有同样的问题,并创建了这些扩展方法:
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Mvc;
using System.Web.Mvc.Html;
public static class EnumHelper
{
private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = string.Empty, Value = string.Empty } };
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
return htmlHelper.EnumDropDownListFor(expression, null);
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var enumType = GetNonNullableModelType(metadata);
var values = Enum.GetValues(enumType).Cast<TEnum>();
var items =
values.Select(value => new SelectListItem
{
Text = GetName(value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
});
if (metadata.IsNullableValueType)
{
items = SingleEmptyItem.Concat(items);
}
return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
}
private static string GetName<TEnum>(TEnum value)
{
var displayAttribute = GetDisplayAttribute(value);
return displayAttribute == null ? value.ToString() : displayAttribute.GetName();
}
private static DisplayAttribute GetDisplayAttribute<TEnum>(TEnum value)
{
return value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DisplayAttribute), false)
.Cast<DisplayAttribute>()
.FirstOrDefault();
}
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
var realModelType = modelMetadata.ModelType;
var underlyingType = Nullable.GetUnderlyingType(realModelType);
return underlyingType ?? realModelType;
}
}
您可以在视图中使用这些扩展方法,如下所示:
@Html.EnumDropDownListFor(c=> comment.CommentType)
你现在应该看到一个下拉列表,其中包含enum值的名称根据他们的DisplayAttribute
。
实际检索显示的枚举值是在GetName
方法中完成的,该方法首先使用GetDisplayAttribute
方法尝试检索枚举值的DisplayAttribute
。如果枚举值确实用DisplayAttribute
装饰,它将使用它来检索要显示的名称。如果没有DisplayAttribute
,则只返回enum值的名称。
正如所料,微软在MVC 5.1 (RC1)中包含了一个EnumDropDownListFor
HTML Helper方法。