Html.DropDownList默认选择疑难解答

时间:2013-10-30 02:37:36

标签: asp.net asp.net-mvc-4 razor

我从我的数据库中选择了一些名称,我在控制器中添加了“无”选项:

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”等),但在每种情况下,显示的选项都是第一个:“无”。我的错误在哪里?

1 个答案:

答案 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,并且类型化视图更安全。