问题是Razor(MVC 5)错误地渲染出HiddenFor和Hidden助手。
我有一个这样的视图模型:
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与强类型值normaly,在这里我改为隐藏显示它甚至与硬编码值不起作用在视图中。
在视图上设置一个断点,显示模型实际上有BoolValueInsideViewModel等于false,但是浏览器上的结果是不同的。我也通过JQuery post回调得到了结果,所以我检查了从AJAX函数返回的原始字符串,其值也是“True”而不是false。
我尝试了什么:
我知道!它看起来很愚蠢,是ASP.NET MVC上最简单的东西,但我花了半天时间。其他视图模型和部分视图正确呈现。
奇怪的是我在视图模型上没有任何数据注释,但为什么它包含HTML元素的数据验证属性?
答案 0 :(得分:1)
对我来说,这是因为我的 url 有一个与 viewmodel 属性同名的查询参数。似乎模型绑定器正在使用查询字符串中的模型值覆盖模型值。
我已经通过更改和删除查询字符串参数和值确认了这一点,并获得了一致的结果。
例如
from collections import Counter
L = [1,2,3,4,3,4,2,3,5]
L2 = [i for c in [Counter(L)] for i,v in enumerate(L) if c[v]==2]
print(L2)
[1, 3, 5, 6]
L2 = [i for i,v in enumerate(L) if L.count(v)==2]
。showMore=False
的值是否为 True
Model.showMore
的值,它将是 True
@HiddenFor(m => m.showMore)
,检查False
的值,它将是showMore=True
@HiddenFor(m => m.showMore)
,检查True
的值,它将是showMore
结论:查询字符串参数值覆盖模型值。不确定这是设计使然还是错误。