0

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

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

4

1 回答 1

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,并将其传递给 View

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

还有其他优点:您可以使用相同的视图模型类作为 POST 操作方法的参数,并且属性会自动绑定到相应的属性,您拥有 Intellisense 并且类型化视图实现起来更安全。

于 2013-10-30T09:07:54.800 回答