模型的隐藏布尔值字段在控制器中设置为 True 后仍为 False



我的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

相关内容

  • 没有找到相关文章