【发布时间】:2014-09-30 11:43:50
【问题描述】:
我正在使用 ASP.NET MVC3,我想用枚举值填充 DropDownList 并选择一个或多个选项。
我自定义了 DropDownList 以使其看起来像“CheckedDropDownList”,并且在一个非常基本的Edit 表单中,我需要检查实际值。
这是我的枚举的构造方式:
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<>() 方法,我试图从 this SO question 改编,但我无法修改它以接受多个选定的值。
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);
}
这是我的使用方法:
@Html.DropDownListFor(m => m.EnumValues,
AttributesHelperExtension.ToLocalizedSelectList<MyEnum>(MyEnum.UNDEFINED, Enum.GetName(typeof(MyEnum), Model.EnumValues.First())
Enum.GetName(typeof(MyEnum), Model.EnumValues.First())),
new { @id = "ddlEnumValue" }
)
EnumValues 定义为:
public MyEnum[] EnumValues { get; set; }
我认为,问题在于,在第三个参数上,我需要传递Model.EnumValues 而不是Model.EnumValues.First(),它总是只预选我的MyEnum 枚举的第一项。
第二个参数也可能是个问题,因为ToLocalizedSelectList<>()需要一个this MyEnum枚举作为第一个参数,所以我将它作为我的枚举的第一项传递,但我不确定这是一个好的解决方案。
如何转换此ToLocalizedSelectList<>() 方法以使其接受多个选定值,以及如何在@Html.DropDownListFor(或@Html.ListBoxFor)中使用它?
非常感谢
仅供参考,我也试过这段代码:
@Html.ListBoxFor(m => m.EnumValues,
new SelectList(Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.OrderBy(e => (int)e)
), new { @id = "ddlMyEnum" }
)
它预先选择了好的valueS,但是,它显示枚举名称,例如UNDEFINED,VALUE1,而不是它们的Display Name属性(Undefined,First Value)等等……
【问题讨论】:
-
是否有理由不去寻找已经存在的东西,例如harvesthq.github.io/chosen???
-
我没有在插件中看到您链接了如何将简单的 DropDownList 转换为 CheckedDropDownList,每个选项前面都有 Checkbox,所以我认为这是一个不使用它的好理由。老实说,我使用 jQuery 多选插件来执行此操作:erichynds.com/blog/jquery-ui-multiselect-widget。 99% 的工作已经完成,我只想回答下面的问题,以获取缺失的 1% 并关闭此问题。
-
还不错,很好奇。
-
我在这里看到了很多问题。首先,如果要选择多个值,则需要
@Html.ListBoxFor(),而不是@HtmlDropDownListFor()。ToLocalizedSelectList()的第一个参数是枚举类型,但您传递的是枚举值。第二个参数似乎毫无意义,因为@Html.ListBoxFor()方法将根据 yot 属性EnumValues中的值将值标记为选中。然后是为此使用枚举的逻辑。也许您应该使用[Flags]属性,这样您就可以将枚举值(标志)集合分配给属性,而不是枚举值数组 -
@StephenMuecke,我尝试将第一个参数更改为
typeof(MyEnum),或MyEnum,但没有成功。你能提供一个代码示例吗?[Flags]属性我不熟悉,我去看看。
标签: asp.net-mvc asp.net-mvc-3 enums multi-select html.dropdownlistfor