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视图中的代码:
<% = 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>
关于我在这里做错了什么或者有效的替代方案的任何建议?
解决方法
> ModelState [“IncludesWeekends”]
> ViewData [“IncludesWeekends”]
> Model.IncludesWeekends
…并将它们找到的任何值转换为String,然后将其用作选定的值.
您的模型上有一个IncludesWeekends属性,因此它会:
Model.IncludesWeekends.ToString()
… …从你的代码判断 – 将导致真“或”假“(因为它是一个布尔).
在您的情况下,您使用c.Id.ToString()作为<选项>您的下拉列表的值,并且由于帮助程序在这些值(“1”/“0”)中找不到其选择的字符串(“True”/“False”),因此它不会选择任何内容.
方法围绕它:
>(最简单的方法):接受使用“True”和“False”作为<选项>值而不是整数ID.
>(几乎同样容易但不是非常干净的方式):将ViewData [“IncludesWeekends”]设置为您想要选择的值(即Id).这是有效的,因为帮助器会在Model.IncludesWeekends之前查看它.
>使用视图模型,其中包含IncludesWeekendsId属性,然后使用它来生成下拉列表,而不是IncludesWeekends:
<%= Html.DropDownList(“IncludesWeekendsId”,Model.YesNoList)%>
要么
<%= Html.DropDownListFor(m => m.IncludesWeekendsId,Model.YesNoList)%>
然后,从视图返回时,将IncludesWeekendsId转换回模型上的正确值.
在这种情况下,如果我没有迂腐的情绪,我可能会选择1.但是,如果您必须为下拉项使用不同的值而不是将模型的属性值转换为字符串,则解决方案3是一种通用的,通常是干净的方法来解决此问题.