MVC 5 Razor更改HiddenFor helper中的布尔值

MVC 5 Razor更改HiddenFor helper中的布尔值,razor,hidden,asp.net-mvc-5,Razor,Hidden,Asp.net Mvc 5,问题是Razor(MVC5)错误地渲染了HiddenFor和HiddenHelper 我有这样一个视图模型: public class MyViewModel { public bool BoolValueInsideViewModel { get; set; } public MyViewModel() { BoolValueInsideViewModel = false; } } @model MyViewModel @Html.Hidde

问题是Razor(MVC5)错误地渲染了HiddenFor和HiddenHelper

我有这样一个视图模型:

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

    public MyViewModel()
    {
        BoolValueInsideViewModel = false;
    }
}
@model MyViewModel
@Html.Hidden("BoolValueInsideViewModel", false)
@Html.Hidden("BoolValueNotInViewModel", false)
控制器简单如下:

model = new MyViewModel();
        model.BoolValueInsideViewModel = false;
        return PartialView("_MyView", model);
第二行只是为了确保值设置为false。 视图如下所示:

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

    public MyViewModel()
    {
        BoolValueInsideViewModel = 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,以表明它即使在视图中使用硬编码值也不起作用)

在视图上放置一个断点,表明该模型实际上具有等于false的BoolValueInsideViewModel,但在浏览器上的结果不同。我还通过jQueryPost回调得到结果,所以我检查了从AJAX函数返回的原始字符串,其中的值也是“True”而不是false

我尝试的是:

  • 清理项目并重建
  • 重命名属性
  • 重命名视图模型,甚至重命名包含视图模型的文件
  • 重命名视图
  • 我知道!在ASP.NETMVC上,它看起来很愚蠢,也是最简单的东西,但我花了半天的时间。其他视图模型和局部视图渲染正确


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

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

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

    比如说,

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

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

    请看这个问题:不一样,我在POST请求中没有相同的密钥。但检查请求是个好主意。感谢您提出的类似请求,但我使用了上面链接中的建议,现在可以解决: