我从我的数据库中选择了一些名称,我在控制器中添加了“无”选项:
var rtrnStaff = (from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
where st.Active == true
select new { st.ID, Name = sal.Desc + ". " + st.Name });
List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
staff.Insert(0, (new SelectListItem { Text = "None", Value = "0" }));
ViewData["Staff"] = staff;
然后我在我的视图中多次将此列表显示为下拉列表,每次我向其提供一个包含所需默认选项ID的变量:
@Html.DropDownList(thisSelectID, (IEnumerable<SelectListItem>)ViewData["Staff"], thisStaffID)
使用断点,我可以看到这些变量正确填充(例如“3”,“2”等),但在每种情况下,显示的选项都是第一个:“无”。我的错误在哪里?
答案 0 :(得分:0)
使用DropDownList
时,您无法设置所选值,但在列表中。没有任何重载允许这样做。
因此,如果您只有一个列表,则所有控件都具有相同的选定项目是不可避免的。
大多数时候情况要好得多,并且为视图使用视图模型类使代码更加清晰,并使用DropDownListFor
。
当您使用DropDowListFor
时,您在视图模型的属性中设置默认属性值,并且您不必执行任何特殊操作来设置所选值。
即。创建一个这样的类:
public class MyViewModel
{
public List<SelectListItem> Staff { get; set; }
public int FirstId { get; set; }
public int SecondId { get; set; }
}
然后,在您看来,
@model MyViewModel
...
@Html.DropDownListFor(m => m.FirstId, Model.Staff);
@Html.DropDownListFor(m => m.SecondId, Model.Staff);
创建MyViewModel
的实例,初始化列表和ID,并将其传递给视图
MyViewModel model = new MyViewModel
{
// Initialize here
};
...
return View("ViewName", model);
还有一些优点:您可以使用相同的视图模型类作为POST操作方法的参数,并且属性会自动绑定到相应的属性,您可以使用Intellisense,并且类型化视图更安全。