我有一个扩展方法,我正在尝试使用它,您可以在其中使用枚举属性创建下拉列表,并设置所选项目:
public enum DefaultEnumSelectItemOptions
{
AddDefaultItemIfEnumIsZero,
ZeroEnumIsDefaultItem
}
public static SelectList ToSelectList(this object enumObj, DefaultEnumSelectItemOptions option = DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
{
var asEnum = Enum.Parse(enumObj.GetType(), enumObj.ToString());
var values = Enum.GetValues(enumObj.GetType());
var dataItems = new List<Tuple<string, int>>();
dataItems.Add(new Tuple<string, int>("Select One", -1));
for (int i = 0; i < values.Length; i++)
{
int enumValue = (int)values.GetValue(i);
if (enumValue == 0)
{
if (option != DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
{
dataItems.Add(new Tuple<string, int>(values.GetValue(i).ToString(), enumValue));
}
}
else
{
dataItems.Add(new Tuple<string, int>(values.GetValue(i).ToString(), enumValue));
}
}
var selectedItemValue = (int)enumObj;
if (selectedItemValue == 0 && option == DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
{
selectedItemValue = -1;
}
return new SelectList(dataItems, "Item2", "Item1", selectedItemValue);
}
一个模型看起来像这样:
public enum PropertyTypes
{
Unknown=0,
Vehicle,
Other
}
[DataContract]
public class Property : ClaimEntity
{
[DataMember]
public PropertyTypes PropertyType { get; set; }
public Property()
{
this.PropertyType = PropertyTypes.Vehicle;
}
}
最后的 View 是这样的:
@Html.DropDownListFor(m => m.PropertyType, Model.PropertyType.ToSelectList())
当我在扩展方法中设置断点时,它似乎是正确的,但所选的选项没有出现在 html 中。
我做错了什么?
编辑 我按照建议将其更改为使用 SelectListItem
,但是我仍然没有看到选择的值:
最佳答案
我自己实际上遇到了这个确切的问题,并发现 DropDownListFor(和 DropDownList)帮助器对于它们自己的好处来说有点太聪明了。
即使您传入了一组SelectListItem
,其中一个Selected = true
,帮助程序实际上会评估您的模型,做a Convert.ToString()
,并尝试匹配该值。如果找不到该值,它将不选择任何内容。
我个人认为这是 MVC 中的一个重大错误,他们似乎没有在 MVC4 中纠正这一错误。他们认为对象的 ToString()
方法会匹配下拉列表中的值(而不是显示文本),这完全是虚假的假设。
编辑:至于解决这个问题的方法......
- 更改您的
ToString()
方法以返回值并找到一种不同的方式来获取显示文本。 - 由于您使用的是枚举,因此您可以只为您的值和显示文本使用字符串版本。它仍然可以很好地绑定(bind)。
- 建立自己的下拉菜单
关于c# - DropdownListFor 所选值未在呈现的 html 中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655220/