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

kma*_*ton 5 c# asp.net-mvc hidden-field asp.net-mvc-4 html.hiddenfor

我在ViewModel类中有这个属性:

public bool AreSimilarEntitiesChecked { get; set; }

在我的控制器中,我将其值设置为"true"并返回带有模型的View:

model.AreSimilarEntitiesChecked = true;

return View(model).WithWarning("Check the similar mentors before saving!");
Run Code Online (Sandbox Code Playgroud)

在我的视图中有一个表单,我放置了这个属性的隐藏字段:

@Html.HiddenFor(m => m.AreSimilarEntitiesChecked)
Run Code Online (Sandbox Code Playgroud)

在View返回包含AreSimilarEntitiesChecked的模型后,其值保持为False desipte我在控制器中设置了True值.

我不知道它有什么问题.

生成的HTML:

<input name="AreSimilarEntitiesChecked" id="AreSimilarEntitiesChecked"
 type="hidden" value="False" data-val-required="The AreSimilarEntitiesChecked
 field is required." data-val="true">
Run Code Online (Sandbox Code Playgroud)

Chr*_*isV 5

我无法确定这是你问题中的问题,但我敢打赌它是很多钱......

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

这种奇怪行为的原因是,假设你有一个字段,用户应该输入一个整数,然后他们写"香蕉".这将发送到服务器进行验证,但失败.我们想再次渲染视图,"banana"仍然在字段中,并且消息不是整数.但是如果视图优先呈现视图模型的数据,则这是不可能的,因为"banana"不是整数并且不能放在该viewmodel字段中.因此保留了POST值.

有两种方法可以解决这个问题.您可以特别为此字段修复它:

ModelState.Remove("AreSimilarEntitiesChecked");
Run Code Online (Sandbox Code Playgroud)

或核选项:

ModelState.Clear();
Run Code Online (Sandbox Code Playgroud)

有关此行为的更多信息,请访问:http://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes