MVC 5 Razor 更改 HiddenFor 助手中的 bool 值

MVC 5 Razor changes bool value in HiddenFor helper

问题是 Razor (MVC 5) 错误地呈现了 HiddenFor 和 Hidden helper。

我有一个像这样的视图模型:

public class MyViewModel
{
    public bool BoolValueInsideViewModel { get; set; }

    public MyViewModel()
    {
        BoolValueInsideViewModel = false;
    }
}

控制器很简单:

model = new MyViewModel();
        model.BoolValueInsideViewModel = false;
        return PartialView("_MyView", model);

第二行只是为了确保值设置为 false。 视图如下所示:

@model MyViewModel
@Html.Hidden("BoolValueInsideViewModel", false)
@Html.Hidden("BoolValueNotInViewModel", false)

但是在浏览器上我得到这个:

<input data-val="true" data-val-required="The BoolValueInsideViewModel field is required." id="BoolValueInsideViewModel" name="BoolValueInsideViewModel" type="hidden" value="true">
<input id="BoolValueNotInViewModel" name="BoolValueNotInViewModel" type="hidden" value="False">

请注意,我在同一个控制器中有 15 个其他视图模型和控制器方法可以使用相同的代码正常工作(我通常使用具有强类型值的 HiddenFor,这里我更改为 Hidden 以表明它即使在困难的情况下也无法正常工作视图中的编码值)。

在视图上打个断点,显示模型实际上有 BoolValueInsideViewModel 等于 false,但在浏览器上的结果不同。我也通过 JQuery post 回调得到结果,所以我检查了从 AJAX 函数返回的原始字符串,那里的值也是 "True" 而不是 false.

我尝试了什么:

  1. 清理项目并重建!
  2. 正在重命名 属性
  3. 重命名视图模型,甚至重命名包含视图模型的文件
  4. 正在重命名视图

我知道!在ASP.NET MVC 上看起来很蠢,也是最简单的东西,但我花了半天时间。其他视图模型和部分视图正确呈现。

奇怪的是我在视图模型上没有任何数据注释,但为什么它在 HTML 元素上包含数据验证属性?

对我来说,这是因为我的 url 有一个与视图模型 属性 同名的查询参数。模型绑定器似乎正在用查询字符串中的模型值覆盖模型值。

我已经通过更改和删除查询字符串参数和值来确认这一点,并获得了一致的结果。

例如,

  1. 假设查询字符串参数是:showMore=False
  2. 您有一个同名模型属性,设置为True
  3. 检查 Model.showMore 的值将是 True
  4. 检查 @HiddenFor(m => m.showMore) 的值,它将是 False
  5. 将查询字符串参数更改为showMore=True,检查@HiddenFor(m => m.showMore)的值,它将是True
  6. 删除查询字符串参数showMore,检查@HiddenFor(m => m.showMore)的值,它将是True

结论:查询字符串参数值覆盖模型值。不确定这是设计使然还是错误。