您缺少设置Text and ValueSelectList 本身中的字段。这就是为什么它做了一个.ToString()
在列表中的每个对象上。你可能会认为给定它是一个列表SelectListItem
它应该足够聪明来检测到这一点......但事实并非如此。
u.UserTypeOptions = new SelectList(
new List<SelectListItem>
{
new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
}, "Value" , "Text", 1);
顺便说一句,您可以使用任何类型的列表或数组...然后只需设置将充当文本和值的属性名称。
我认为这样做更好:
u.UserTypeOptions = new SelectList(
new List<SelectListItem>
{
new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
}, "Value" , "Text");
我去掉了-1项,每一项的设置都选择了true/false。
那么,在你看来:
@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one")
这样,如果您设置了“选择一个”项,但没有将 SelectList 中的一项设置为选中,则UserType
将为空(UserType
需要int?
).
如果需要将 SelectList 项之一设置为选中,可以使用:
u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected);
正如一位用户在评论中解释的那样:使用以下方式绑定到属性时,将忽略 SelectList 构造函数的第四个选项DropDownListFor()
- 属性的值决定了选择的内容。