我正在尝试为我的ASP.NET MVC3网站编写一个帮助程序,该帮助程序将能够返回包含Enum的所有SelectList
属性标记的新Description
例如,使用以下枚举:
public enum Test
{
[Display(Name = "Membre 1")]
Member1,
[Display(Name = "Membre 2")]
Member2
}
我希望能够使用以下内容填充DropDownListFor
:
@Html.DropDownListFor(m => m.MyTest, MyHelper(Test))
(MyTest
是Test
变量)。
我希望我的DropDownList
包含:
我曾经使用过这个工作助手:
public static string GetEnumDescription(this Enum value)
{
Type enumType = value.GetType();
var enumValue = Enum.GetName(enumType, value);
MemberInfo member = enumType.GetMember(enumValue)[0];
var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
var outString = ((DisplayAttribute)attrs[0]).Name;
if (((DisplayAttribute)attrs[0]).ResourceType != null)
{
outString = ((DisplayAttribute)attrs[0]).GetName();
}
return outString;
}
...但我无法在SelectList
如何修改此项以直接将其“合并”到我的@Html.DropDownListFor
帮助程序中?
我在互联网上看到了一些帮助,特别是here或here,但没有人适合我。有没有人能够共享一个简短和优雅帮助器,它会返回枚举成员的所有Display
属性,以便将它们放入{{ 1}}?
答案 0 :(得分:1)
为了实现Enum类型数据,我认为最简单的方法是使用自定义Enum帮助程序和模板。以下是我在项目中实现它们的方法。
1)创建Enum Helper
public static class EnumHelper
{
public static IEnumerable<SelectListItem> GetItems(this Type enumType, int? selectedValue)
{
if (!typeof (Enum).IsAssignableFrom(enumType))
{
throw new ArgumentException("Type must be an enum");
}
string[] names = Enum.GetNames(enumType);
IEnumerable<int> values = Enum.GetValues(enumType).Cast<int>();
IEnumerable<SelectListItem> items = names.Zip(values, (name, value) =>
new SelectListItem
{
Text = GetName(enumType, name),
Value = value.ToString(),
Selected = value == selectedValue
}
);
return items;
}
// Get Display Name
private static string GetName(Type enumType, string name)
{
string result = name;
DisplayAttribute attribute = enumType.GetField(name)
.GetCustomAttributes(false)
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (attribute != null)
{
result = attribute.GetName();
}
return result;
}
public static string GetItemName(this Type enumType, int selectedValue)
{
if (!typeof (Enum).IsAssignableFrom(enumType))
{
throw new ArgumentException("Type must be an enum");
}
var itemName = GetName(enumType, Enum.GetNames(enumType)[selectedValue]);
return itemName;
}
}
2)在共享文件夹中创建文件夹调用“DisplayTemplates”。
3)在“DisplayTemmplates”中创建视图。视图如下所示:
@using Demo.Web.Helper
@{
var itemName = typeof(Test).GetItemName((int)Model);
}
4)在共享文件夹中创建floder调用“EditorTemplates”。
5)在“EditorTemplates”中创建视图。视图如下所示:
@using Demo.Web.Helper
@{
var items = typeof (Test).GetItems((int?)Model);
}
@Html.DropDownList("",items)
在这里,您已经完成了所有帮助和模板,随时可以使用。如果要实现Enum Type数据,只需使用如下所示:
<强>模型强>
public class MyModel
{
public int Id { get; set; }
//
public Test Test { get; set; }
}
查看强>
@Html.DisplayFor(m => m.Test)
or
@Html.EditorFor(m => m.Test)
希望它有所帮助。
答案 1 :(得分:1)
以下是我使用的内容。这是我在网上找到的东西的略微修改版本。我会在信用到期时给予信任,但我不记得我最初在哪里找到它:
public static SelectList ToSelectList(this Enum enumeration)
{
var list = (from Enum d in Enum.GetValues(enumeration.GetType())
select new { Value = Enum.GetName(enumeration.GetType(), d), Text = d.GetDescription() }).ToList();
var selectedValue = (int)Enum.Parse(enumeration.GetType(), Enum.GetName(enumeration.GetType(), enumeration));
return new SelectList(list, "Value", "Text");
}
public static string GetDescription(this Enum en)
{
Type type = en.GetType();
System.Reflection.MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((System.ComponentModel.DataAnnotations.DisplayAttribute)attrs[0]).GetName();
}
return en.ToString();
}
在您看来,您可以使用它:
@Html.DropDownListFor(m => m.MyEnumProperty, Model.MyEnumProperty.ToSelectList())