Asp.net mvc 如何在使用枚举值填充的DropDownList中选择多个值?
我正在使用ASP.NET MVC3,我想用枚举值填充DropDownList,并选择一个或多个选项 我定制了DropDownList,以使它看起来像一个“CheckedDropDownList”,并且,在一个非常基本的Asp.net mvc 如何在使用枚举值填充的DropDownList中选择多个值?,asp.net-mvc,asp.net-mvc-3,enums,multi-select,html.dropdownlistfor,Asp.net Mvc,Asp.net Mvc 3,Enums,Multi Select,Html.dropdownlistfor,我正在使用ASP.NET MVC3,我想用枚举值填充DropDownList,并选择一个或多个选项 我定制了DropDownList,以使它看起来像一个“CheckedDropDownList”,并且,在一个非常基本的编辑表单中,我需要检查实际值 以下是如何构造我的枚举: public enum MyEnum { [Display(Name = "Undefined")] UNDEFINED = -1, //I really need this "detail" [Di
编辑
表单中,我需要检查实际值
以下是如何构造我的枚举:
public enum MyEnum
{
[Display(Name = "Undefined")]
UNDEFINED = -1, //I really need this "detail"
[Display(Name = "First Value")]
VALUE1,
[Display(Name = "Second Value")]
VALUE2
[Display(Name = "Other")]
OTHER,
}
我还使用了这个ToLocalizedSelectList()
方法,我试图从中进行调整,但无法修改它以接受多个选定值
public static SelectList ToLocalizedSelectList<T>(this T enumeration, string selected)
{
var source = Enum.GetValues(typeof(T)).Cast<T>().OrderBy(x => x); //I always need UNDEFINED as first element
var items = new Dictionary<object, string>();
var displayAttributeType = typeof(DisplayAttribute);
foreach (var value in source)
{
FieldInfo field = value.GetType().GetField(value.ToString());
DisplayAttribute attrs = (DisplayAttribute)field.GetCustomAttributes(displayAttributeType, false).FirstOrDefault();
items.Add(value, attrs != null ? attrs.GetName() : value.ToString());
}
return new SelectList(items, "Key", "Value", selected);
}
问题是,我认为,在第三个参数上,我需要传递Model.EnumValues
,而不是Model.EnumValues.First()
,它总是只预选MyEnum枚举的第一项
第二个参数也可能是个问题,因为ToLocalizedSelectList()
需要一个this MyEnum枚举作为第一个参数,所以我将它作为枚举的第一项传递给它,但我不确定这是一个好的解决方案
如何将此转换为LocalizedSelectList()
方法以使其接受多个选定值,以及如何在@Html.DropDownListFor
(或@Html.ListBoxFor
)中使用它
非常感谢
仅供参考,我还尝试了以下代码:
@Html.ListBoxFor(m => m.EnumValues,
new SelectList(Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.OrderBy(e => (int)e)
), new { @id = "ddlMyEnum" }
)
@Html.ListBoxFor(m=>m.EnumValues,
新建SelectList(Enum.GetValues(typeof(MyEnum))
.Cast()
.OrderBy(e=>(int)e)
),新的{@id=“ddlmeyenum”}
)
并且它预先选择好的值,但是,它显示枚举名称,如
未定义
,值1
,而不是它们的显示名称
属性(未定义
,第一个值
)等等。注意:这只解决了部分代码问题-显示“友好”枚举描述
创建用于获取友好描述的扩展方法。注意:这使用的是[Description]
属性,而不是[Display]
属性
public static string ToDescription(this Enum value)
{
FieldInfo field = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])field
.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
{
return attributes[0].Description;
}
return value.ToString();
}
它可以与
public enum ProjectStatus
{
Draft,
[Description("In limbo")]
OnHold,
Completed
}
然后创建一个扩展方法来创建一个选择列表
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
where TEnum : struct, IComparable, IFormattable, IConvertible
{
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new { ID = e, Name = e.ToDescription() }; // or ID = (int)e, depending on what you want the as the value
return new SelectList(values, "ID", "Name", enumObj);
}
至于其余的部分,我不理解您的方法,也不理解创建枚举值数组会有什么好处,也不理解结果如何存储在数据库中。我的方法是在视图模型中创建布尔属性,然后让用户检查他们想要的选项。我今天刚刚用以下方法纠正了这个老错误:
@Html.ListBoxFor(m => m.EnumValues,
Model.EnumValues.ToLocalizedSelectList<MyEnum>(Model.EnumValues.ToList())
)
@Html.ListBoxFor(m=>m.EnumValues,
Model.EnumValues.ToLocalizedSelectList(Model.EnumValues.ToList())
)
其中ToLocalizedSelectList()
与上面发布的相同,但签名除外:
public static SelectList ToLocalizedSelectList<T>(this T[] enumeration, List<T> selected)
publicstaticselectlist到localizedselectlist(此T[]枚举,选择列表)
希望它对某人有所帮助是否有理由不去寻找已经存在的东西,例如??我没有在你链接的插件中看到如何像我一样将一个简单的DropDownList转换为一个在每个选项前面带有复选框的CheckedDropDownList,所以我认为这是一个不使用它的好理由。为了诚实起见,我使用jquerymultiselect插件来做到这一点:。99%的工作都完成了,我只想回答下面的问题,以得到缺少的1%并解决这个问题。足够公平,我很好奇。我在这里看到很多问题。首先,如果要选择多个值,则需要
@Html.ListBoxFor()
,而不是@HtmlDropDownListFor()
。ToLocalizedSelectList()
的第一个参数是类型enum,但您需要传递一个enum值。第二个参数似乎毫无意义,因为@Html.ListBoxFor()
方法将根据yot属性EnumValues
中的值将值标记为选中。然后是使用枚举的逻辑。也许您应该使用[Flags]
属性,以便将枚举值(标志)的集合分配给属性,而不是枚举数组values@StephenMuecke,我尝试将第一个参数更改为typeof(MyEnum)
,或MyEnum
,但没有成功。你能提供一个代码示例吗?我不熟悉[Flags]
属性,我来看看。您的代码正常工作,所以我向上投票;但是,正如您自己所说,它并没有真正解决问题,因为我已经知道如何在DropDownList for中显示[display]
属性(请参阅我第一篇文章的最后一部分)。我真正需要的是如何预先选择多个元素,这些元素在listbox的Display
属性中显示,以表示感谢(不希望出现勾号)。这可能有用。如果EnumValues
是int[]
并且它的值被设置为[1,3]
,那么SelectList
将选项值创建为int
(在我的扩展方法中,它将是选择新的{ID=(int)e,Name=e.ToDescription()}
,那么@Html.ListBoxFor(m=>m.EnumValues,Model.X)
(可能)选择第二个和第四个值。注意Model.X
是视图Modelpublic MyEnum Something{get;set;}
中的一个属性,默认为UNDEFINED
,以便您可以生成具有友好名称的选择列表,并在EnumValues
为空时提供默认选择
@Html.DropDownListFor(m => m.Status, Model.Status.ToSelectList())
@Html.ListBoxFor(m => m.EnumValues,
Model.EnumValues.ToLocalizedSelectList<MyEnum>(Model.EnumValues.ToList())
)
public static SelectList ToLocalizedSelectList<T>(this T[] enumeration, List<T> selected)