5

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

在 View 返回包含 AreSimilarEntitiesChecked 的模型后,它的值仍然为 False,尽管我在控制器中设置了 True 值。

我不知道它有什么问题。

生成的 HTML:

<input name="AreSimilarEntitiesChecked" id="AreSimilarEntitiesChecked"
 type="hidden" value="False" data-val-required="The AreSimilarEntitiesChecked
 field is required." data-val="true">
4

1 回答 1

6

我不能确定这是你的问题的问题,但我敢打赌它是......

MVCModelState保留视图模型数据的表示,优先从 POST 数据中提取值,而不是从绑定模型中获取它们。也就是说,如果 HTTP POST 包含一个名为(不区分大小写)AreSimilarEntitiesChecked且值为 的字段False,那么在呈现视图时,您在视图模型中将该属性设置为什么都没有关系。ModelState将更喜欢 POSTed 值而不是 viewmodel 值。

这种奇怪行为的原因是,假设您有一个字段,用户应该在其中输入一个整数,而他们写的是“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

于 2015-02-24T11:31:53.597 回答