当字段值为 null 时,Razor View 引擎是否会操作下拉列表中的选定项?

Does Razor View engine manipulates the selected item of a dropdown when field value is null?

我希望有人能解释一下这是怎么回事。
我的页面上有几个下拉列表,它们具有相同的项目集(null、True、False)。我不明白如何以及为什么,当页面呈现时,我看到 Razor 如果值为空,则选择当前下拉列表中的前一个所选项目。

这是我的代码:

public class DdlViewModel
{
    public bool? Field1 { get; set; }
    public bool? Field2 { get; set; }
    public bool? Field3 { get; set; }
    public bool? Field4 { get; set; }
    public bool? Field5 { get; set; }
    public IEnumerable<SelectListItem> YesNoBlank { get; set; }
}

public ActionResult DDl()
{
    var selectListItems = new List<SelectListItem>
    {
        new SelectListItem {Value = null, Text = ""},
        new SelectListItem {Value = "True", Text = "Yes"},
        new SelectListItem {Value = "False", Text = "No"},
    };

    var viewModel = new DdlViewModel();
    viewModel.Field2 = true;
    viewModel.Field4 = false;
    viewModel.YesNoBlank = selectListItems;

    return View(viewModel);
}

这是视图;

<body>
    <div>
        Field 1 @Html.DropDownListFor(b => b.Field1, Model.YesNoBlank)
        <br />
        Field 2 @Html.DropDownListFor(b => b.Field2, Model.YesNoBlank)
        <br />
        Field 3 @Html.DropDownListFor(b => b.Field3, Model.YesNoBlank)
        <br />
        Field 4 @Html.DropDownListFor(b => b.Field4, Model.YesNoBlank)
        <br />
        Field 5 @Html.DropDownListFor(b => b.Field5, Model.YesNoBlank)
    </div>
</body>

这是结果,实际上我希望字段 3 和字段 5 为空,因为字段 1 是空的;

更新

根据 Tetsuya Yamamoto 的回答,我更改了我的代码如下。这也成功了。并且不需要对我的观点进行任何更改。

public class DdlViewModel
{
    ...
    public SelectList YesNoBlank { get; set; }
}

public ActionResult DDl()
{
    var selectListItems = new SelectList(new List<SelectListItem>
    {
        new SelectListItem {Value = null, Text = ""},
        new SelectListItem {Value = "True", Text = "Yes"},
        new SelectListItem {Value = "False", Text = "No"},
    }, "Value", "Text");

    ...
}

不是对所有下拉菜单使用相同的 Model.YesNoBlank,您可以传递 null 值以强制为第三个和第五个 DropDownListFor 选择值,如下所示:

@Html.DropDownListFor(b => b.Field3, new SelectList(Model.YesNoBlank, "Value", "Text", null))

@Html.DropDownListFor(b => b.Field5, new SelectList(Model.YesNoBlank, "Value", "Text", null))

请注意,IEnumerable<SelectListItem> 集合 "remembers" 在应用于 DropDownListFor 时最后选择的值设置(即为此目的存在 Selected property),因此如果第二个下拉菜单的所选值设置为 true,使用相同 IEnumerable<SelectListItem> 属性 的下一个下拉菜单将设置相同的值,直到列表项中存在另一个值被分配为所选值。

当使用 foreach 循环生成具有相同 IEnumerable<SelectListItem> 属性 的 DropDownListFor 作为列表项并包含选定值时,同样的行为也存在,如 this issue.

简而言之,Nullable<bool> 属性 不会在设置后从 Selected 属性 中清除所选值。所以,答案是 "no" 因为 IEnumerable<SelectListItem> 选择的值没有重置,即使明确分配了空值,例如viewModel.Field3 = null.

实例:.NET Fiddle Demo

相关问题:MVC Multiple DropDownLists from 1 List<SelectListItem>