Asp.net Html.DropDownList默认选择疑难解答

Asp.net Html.DropDownList默认选择疑难解答,asp.net,asp.net-mvc-4,razor,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<Sele

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

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;
var rtrnStaff=(从db.PrmTbl\u staff中的st开始
在st.SALLATIONID等于sal.ID的db.PrmTbl_称呼中加入sal
其中st.Active==true
选择新的{st.ID,Name=sal.Desc+“+st.Name});
List staff=new SelectList(rtrnStaff,“ID”,“Name”).ToList();
Insert(0,(new SelectListItem{Text=“None”,Value=“0”});
ViewData[“员工”]=员工;
然后,我在视图中多次以下拉列表的形式显示此列表,每次向其提供一个包含所需默认选项ID的变量:

@Html.DropDownList(thisSelectID, (IEnumerable<SelectListItem>)ViewData["Staff"], thisStaffID)
@Html.DropDownList(thisSelectID,(IEnumerable)ViewData[“Staff”],thisStaffID)

使用断点,我可以看到这些变量被正确填充(例如“3”、“2”等),但在每种情况下,显示的选项都是第一个:“无”。我的错误在哪里?

当您使用
DropDownList
时,您无法设置所选值,只能在列表中设置。所有重载都不允许这样做

因此,如果只有一个列表,那么不可避免的是所有控件都具有相同的选定项

大多数情况下,使用视图模型类进行视图,并使用
DropDownListFor
,这样做会更好,代码也更清晰

使用
DropDowListFor
时,可以在视图模型的属性中设置默认属性值,并且不必执行任何特殊操作来设置选定的值

例如,创建一个如下所示的类:

public class MyViewModel
{
    public List<SelectListItem> Staff { get; set; }
    public int FirstId { get; set; }
    public int SecondId { get; set; }
}
创建
MyViewModel
的实例,初始化列表和ID,并将其传递给视图

MyViewModel model = new MyViewModel 
{
    // Initialize here 
};
...
return View("ViewName", model);

还有其他优点:您可以使用与POST action方法的参数相同的视图模型类,并且属性会自动绑定到相应的属性,您具有Intellisense,并且类型化视图更易于实现。

尝试使用
.Add()
method@Johnx我不想使用
Selected=false
arg将“None”选项从所选位置取消,因为在视图中有一种情况下,我确实希望它作为默认选项。这就是您想要了解的,还是使用
.Add()
还有其他原因?我不确定如何使用循环中存储为变量的ID来识别使用此示例显示的选择。我以前从未使用过DropDownList-您是否可以使用我的问题中所示的变量编辑您的答案以显示它?显示您的视图的更多代码,并添加一些额外的解释,以便我能够理解您试图实现的目标。。。乍一看,它看起来不太像MVC。
MyViewModel model = new MyViewModel 
{
    // Initialize here 
};
...
return View("ViewName", model);