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);
}