C# 模型&x27;s Hidden bool字段在控制器中设置为True后仍为False

C# 模型&x27;s Hidden bool字段在控制器中设置为True后仍为False,c#,asp.net-mvc,asp.net-mvc-4,hidden-field,html.hiddenfor,C#,Asp.net Mvc,Asp.net Mvc 4,Hidden Field,Html.hiddenfor,我的ViewModel类中有以下属性: public bool是选中的相似实体{get;set;} 在我的控制器中,我将其值设置为“true”,并返回带有模型的视图: model.AreSimilarEntitiesChecked = true; return View(model).WithWarning("Check the similar mentors before saving!"); 在我看来,我在一张表格中放置了该财产的一个隐藏字段: @Html.HiddenFor(m =&g

我的ViewModel类中有以下属性:

public bool是选中的相似实体{get;set;}

在我的控制器中,我将其值设置为“true”,并返回带有模型的视图:

model.AreSimilarEntitiesChecked = true;

return View(model).WithWarning("Check the similar mentors before saving!");
在我看来,我在一张表格中放置了该财产的一个隐藏字段:

@Html.HiddenFor(m => m.AreSimilarEntitiesChecked)
返回包含AreSimilarEntities的模型的视图后,其值仍为False Desipt,这是因为我在控制器中设置了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数据中提取值,而不是从绑定模型中获取值。也就是说,如果HTTP POST包含一个名为(不区分大小写)
AreSimilarEntities Checked
的字段,其值为
False
,则渲染视图时在viewmodel中将该属性设置为什么并不重要
ModelState
更喜欢发布的值而不是viewmodel值

这种奇怪行为的原因是,假设您有一个字段,其中用户应该输入一个整数,而他们写的是“banana”。这将发送到服务器进行验证,但验证失败。我们希望再次渲染视图,字段中仍然有“香蕉”和一条不是整数的消息。但是,如果视图优先渲染viewmodel的数据,这是不可能的,因为“香蕉”不是整数,不能放在viewmodel字段中。因此,将保留POST值

有两种方法可以解决这个问题。您可以为该字段专门修复它:

ModelState.Remove("AreSimilarEntitiesChecked");
或核选择:

ModelState.Clear();

有关此行为的更多信息,请参见此处:

生成的html显示
value=“False”
,因此未将其设置为
true
。您的代码中有其他内容阻止对其进行设置或正在重新设置。您是否正在执行
model.AreSimilarEntitiesChecked=true
在GET或POST方法中?感谢您的回复,这就是问题所在。不用担心。我花了大约5个小时才弄清楚我第一次撞到它。我将一个模型发布到一个方法中,并在视图中返回一个不同的模型,但即使切换模型类型,它的行为仍然是这样。我想这会教我不要使用Post重定向Get。