模型的 Hidden bool 字段在控制器中设置为 True 后仍然为 False

The model's Hidden bool field remains False after it was set True in the controller

我的 ViewModel 中有这个 属性 class:

public bool AreSimilarEntitiesChecked { get; set; }

在我的控制器中,我设置了它的值 'true' 和 return 带有模型的视图:

model.AreSimilarEntitiesChecked = true;

return View(model).WithWarning("Check the similar mentors before saving!");

在我的视图中有一个表格,我在其中放置了这个 属性:

的隐藏字段
@Html.HiddenFor(m => m.AreSimilarEntitiesChecked)

在使用包含 AreSimilarEntitiesChecked 的模型编辑视图 return 之后,尽管我在控制器中设置了 True 值,但其值仍然为 False。

我不知道它有什么问题。

生成 HTML:

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

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

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

出现这种奇怪行为的原因是,假设您有一个字段,用户应该在其中输入一个整数,但他们却写成了 "banana"。这被发送到服务器进行验证,但验证失败。我们想再次呈现视图,"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