我的ViewModel类中有这个属性:
public bool AreSimilarEntitiesChecked { get; set; }
在我的控制器中,我将其值设置为"true",并返回带有模型的视图:
model.AreSimilarEntitiesChecked = true;
return View(model).WithWarning("Check the similar mentors before saving!");
在我的视图中,有一个表格,我在其中放置了此属性的隐藏文件:
@Html.HiddenFor(m => m.AreSimilarEntitiesChecked)
在视图与包含AreSimilarEntitiesChecked的模型一起返回后,其值保持为False,不考虑我在控制器中设置True值的事实。
我不知道它可能出了什么问题。
生成的HTML:
<input name="AreSimilarEntitiesChecked" id="AreSimilarEntitiesChecked"
type="hidden" value="False" data-val-required="The AreSimilarEntitiesChecked
field is required." data-val="true">
我不能从你的问题中确定这是问题所在,但我敢打赌这是…
MVC的ModelState
保留视图模型数据的表示,它优先从POST数据中提取值,而不是从绑定模型中获取值。也就是说,如果HTTPPOST包含一个名为(不区分大小写)AreSimilarEntitiesChecked
、值为False
的字段,那么在呈现视图时,在视图模型中将该属性设置为什么并不重要。ModelState
将更喜欢POSTed值而不是视图模型值。
这种奇怪行为的原因是,假设你有一个字段,用户应该在其中输入一个整数,而他们却写"banana"。这将被发送到服务器进行验证,但验证失败。我们想再次渲染视图,"banana"仍在字段中,并显示一条不是整数的消息。但是,如果视图优先渲染视图模型的数据,那就不可能了,因为"香蕉"不是整数,不能放在视图模型字段中。因此,POST值被保留。
有两种解决方案。要么你可以专门为这个字段修复它:
ModelState.Remove("AreSimilarEntitiesChecked");
或者核选项:
ModelState.Clear();
有关这种行为的更多信息,请点击此处:http://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes