当字段值为 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
.
相关问题:MVC Multiple DropDownLists from 1 List<SelectListItem>
我希望有人能解释一下这是怎么回事。
我的页面上有几个下拉列表,它们具有相同的项目集(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
.
相关问题:MVC Multiple DropDownLists from 1 List<SelectListItem>