我有一个 asp.net-mvc 网站,但我遇到了一个问题,即未选择下拉列表中正确的选定项目。我的 Controller 操作中有以下代码(已简化以隔离问题):
public ActionResult MyAction()
{
var vm = GetVM();
var list = new List<INamed> {new NamedInfo() {Id = 1, Name = "Yes"}, new NamedInfo() {Id = 0, Name = "No"}};
vm.YesNoList = SelectListHelper.GenerateDropdownList(vm.IncludesWeekends ? 1 : 0, list);
return View(vm);
}
这是 GenerateDropdownList 的定义
public static List<SelectListItem> GenerateDropdownList<T>(int id, IEnumerable<T> list) where T : INamed
{
List<SelectListItem> dropdown = list.Select(c => new SelectListItem
{
Selected = c.Id == id,
Text = c.ToString(),
Value = c.Id.ToString()
}).ToList();
return dropdown;
}
下面是我的 HTML View 中的代码:
<% = Html.DropDownList("IncludesWeekends", Model.YesNoList, new { @id = "IncludesWeekends" })%>
我希望在我的示例中选择 No (当我在服务器端放置断点时它具有 Selected = true 但当我查看生成的 html 时,没有选择任何内容:
<select id="IncludesWeekends" class="autoComplete1" name="IncludesWeekends">
<option value="1">Yes</option>
<option value="0">No</option>
</select>
默认情况下选择"is",因为它是第一项。
关于我在这里做错了什么或可行的替代方案有什么建议吗?
最佳答案
Selected
中的 SelectListItem
属性大多是无用的 (more about that in my answer here) 。在大多数情况下,HTML 助手会忽略它。相反,在您的情况下,他们将查看以下值:
ModelState["IncludesWeekends"]
ViewData["IncludesWeekends"]
Model.IncludesWeekends
...并将他们找到的任何值转换为
String
,然后将其用作选定的值。你的模型上有一个
IncludesWeekends
属性,所以它会做:Model.IncludesWeekends.ToString()
...从您的代码判断,这将导致 True"或 "False"(因为它是
bool
)。在您的情况下,您使用
c.Id.ToString()
作为下拉列表的 <option>
值,并且由于助手不会在这些值(“1”/“0”)中找到它选择的字符串(“True”/“False”),它不会选择任何东西。解决方法:
<option>
值而不是整数 ID。 ViewData["IncludesWeekends"]
设置为您想要选择的值(即 Id
)。这是有效的,因为助手会在 Model.IncludesWeekends
之前查看它。 IncludesWeekendsId
属性,然后使用它来生成下拉列表,而不是 IncludesWeekends
:<%= Html.DropDownList("IncludesWeekendsId", Model.YesNoList) %>
或者
<%= Html.DropDownListFor(m => m.IncludesWeekendsId, Model.YesNoList) %>
然后,从 View 返回时,将
IncludesWeekendsId
转换回模型上的正确值。 在这种情况下,如果我没有迂腐的情绪,我可能会选择 1 。但是解决方案 3 是解决此问题的通用且大部分是干净的方法,如果您必须为下拉项使用不同的值而不是转换为字符串的模型属性的值。
关于asp.net-mvc - 在我的 asp.net-mvc 页面中,为什么没有选择正确的下拉列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18175210/