Select 标签助手 - 当控制器参数名称匹配模型时的意外行为 属性
Select tag helper - unexpected behavior when controller argument name matches model property
我 运行 遇到一个问题,即 <select>
元素的默认值未正确设置为我在标签助手中设置的 属性 模型的值。
导致问题的原始代码:
控制器操作:
public async Task<ActionResult> Test(int? id = null, string siteAbbreviation = null)
{
MyModel model = await GetModelData(id, siteAbbreviation);
model.SiteAbbreviation = "AA";
return PartialView("Test", model);
}
查看:
@model MyModel
<select asp-for="SiteAbbreviation" class="form-control">
<option>-select-</option>
<option value="AA">Some AA Text</option>
<option value="BB">Some BB Text</option>
<option value="CC">Some CC Text</option>
</select>
// Note that I also tried with @DropDownListFor(m => m.SiteAbbreviation)
在上面的控制器操作中,我将模型 属性 SiteAbbreviation 覆盖为“AA” - 所以这应该始终是选定的选项;但是,当像这样调用操作时:Test?id=0&siteAbbreviation=BB,“BB”成为选定的选项。使用断点,我可以看到 Model.SiteAbbreviation 在到达视图时被正确覆盖。
我设法通过将控制器操作的参数名称从 string siteAbbreviation
更改为 string site
来解决此问题。这意味着参数与我的模型相同 属性 使我的标签助手的选定值失效。
这是为什么?
在客户端绑定数据时,会先从 ModelState 中获取值,然后再从 Model 中获取。您可以尝试在 action 中添加 ModelState.Clear
:
public async Task<ActionResult> Test(int? id = null, string siteAbbreviation = null)
{
MyModel model = await GetModelData(id, siteAbbreviation);
ModelState.Clear();
model.SiteAbbreviation = "AA";
return PartialView("Test", model);
}
我 运行 遇到一个问题,即 <select>
元素的默认值未正确设置为我在标签助手中设置的 属性 模型的值。
导致问题的原始代码:
控制器操作:
public async Task<ActionResult> Test(int? id = null, string siteAbbreviation = null)
{
MyModel model = await GetModelData(id, siteAbbreviation);
model.SiteAbbreviation = "AA";
return PartialView("Test", model);
}
查看:
@model MyModel
<select asp-for="SiteAbbreviation" class="form-control">
<option>-select-</option>
<option value="AA">Some AA Text</option>
<option value="BB">Some BB Text</option>
<option value="CC">Some CC Text</option>
</select>
// Note that I also tried with @DropDownListFor(m => m.SiteAbbreviation)
在上面的控制器操作中,我将模型 属性 SiteAbbreviation 覆盖为“AA” - 所以这应该始终是选定的选项;但是,当像这样调用操作时:Test?id=0&siteAbbreviation=BB,“BB”成为选定的选项。使用断点,我可以看到 Model.SiteAbbreviation 在到达视图时被正确覆盖。
我设法通过将控制器操作的参数名称从 string siteAbbreviation
更改为 string site
来解决此问题。这意味着参数与我的模型相同 属性 使我的标签助手的选定值失效。
这是为什么?
在客户端绑定数据时,会先从 ModelState 中获取值,然后再从 Model 中获取。您可以尝试在 action 中添加 ModelState.Clear
:
public async Task<ActionResult> Test(int? id = null, string siteAbbreviation = null)
{
MyModel model = await GetModelData(id, siteAbbreviation);
ModelState.Clear();
model.SiteAbbreviation = "AA";
return PartialView("Test", model);
}