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.
我尝试了什么:
- 清理项目并重建!
- 正在重命名 属性
- 重命名视图模型,甚至重命名包含视图模型的文件
- 正在重命名视图
我知道!在ASP.NET MVC 上看起来很蠢,也是最简单的东西,但我花了半天时间。其他视图模型和部分视图正确呈现。
奇怪的是我在视图模型上没有任何数据注释,但为什么它在 HTML 元素上包含数据验证属性?
对我来说,这是因为我的 url 有一个与视图模型 属性 同名的查询参数。模型绑定器似乎正在用查询字符串中的模型值覆盖模型值。
我已经通过更改和删除查询字符串参数和值来确认这一点,并获得了一致的结果。
例如,
- 假设查询字符串参数是:
showMore=False
- 您有一个同名模型属性,设置为
True
。
- 检查
Model.showMore
的值将是 True
- 检查
@HiddenFor(m => m.showMore)
的值,它将是 False
- 将查询字符串参数更改为
showMore=True
,检查@HiddenFor(m => m.showMore)
的值,它将是True
- 删除查询字符串参数
showMore
,检查@HiddenFor(m => m.showMore)
的值,它将是True
结论:查询字符串参数值覆盖模型值。不确定这是设计使然还是错误。
问题是 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.
我尝试了什么:
- 清理项目并重建!
- 正在重命名 属性
- 重命名视图模型,甚至重命名包含视图模型的文件
- 正在重命名视图
我知道!在ASP.NET MVC 上看起来很蠢,也是最简单的东西,但我花了半天时间。其他视图模型和部分视图正确呈现。
奇怪的是我在视图模型上没有任何数据注释,但为什么它在 HTML 元素上包含数据验证属性?
对我来说,这是因为我的 url 有一个与视图模型 属性 同名的查询参数。模型绑定器似乎正在用查询字符串中的模型值覆盖模型值。
我已经通过更改和删除查询字符串参数和值来确认这一点,并获得了一致的结果。
例如,
- 假设查询字符串参数是:
showMore=False
- 您有一个同名模型属性,设置为
True
。 - 检查
Model.showMore
的值将是True
- 检查
@HiddenFor(m => m.showMore)
的值,它将是False
- 将查询字符串参数更改为
showMore=True
,检查@HiddenFor(m => m.showMore)
的值,它将是True
- 删除查询字符串参数
showMore
,检查@HiddenFor(m => m.showMore)
的值,它将是True
结论:查询字符串参数值覆盖模型值。不确定这是设计使然还是错误。