我的表格很像......
@using (Html.BeginForm("create", "Account", FormMethod.Post, new { id = "accountform_form" }))
{
@Html.TextBoxFor(e => e.ShipFirstName)
...
}
在测试时,我很惊讶地看到该字段在回发时保留了它的价值,即使我没有将它分配给视图模型。使用调试器时,ShipFirstName
的值在返回视图时在操作结束时为null
,那么为什么它会显示字段中的值?我是否一直在不必要地将发布的值分配给视图模型属性?或者还有其他事情发生了吗?
更新:动作就是这样......
[HttpPost]
public ViewResult Create(AccountFormModel postModel)
{
var model = new AccountFormModel(postModel, stuff, stuff); //I use posted values and paramters to create the actual view model
return view(model);
}
所以,我看到GET
表单,输入值,说我输入一个字段并将所需字段留空,提交,结果页面具有我在另一个字段中输入的值,谁将它放在那里在模型中它是null
?
答案 0 :(得分:2)
我今天早些时候碰到了类似的东西(总是检查一个复选框)。看看Changing ViewModel properties in POST action,看看它是否相似。
基本上调用ModelState.Clear()为我修复了它。
答案 1 :(得分:2)
当你在模型发布后将模型传递回视图时,MVC正在采取你正在这样做的立场,因为表单包含错误。因此,不是让用户再次填写表单,而是使用ModelState
集合重新填充表单。在这种情况下,ModelState
集合中的值优先于您在操作中所做的更改(这确实感觉有点奇怪)。
您可以通过致电ModelState.Clear()或使用ModelState.Remove(string key)来解决此问题,其中key
是酒店的名称。
如果您想详细说明原因,请参阅ASP.NET MVC’s Html Helpers Render the Wrong Value!。摘录:
为什么?
ASP.NET MVC假设如果您在回复HTTP POST时呈现View,并且您正在使用Html Helpers,那么您最有可能重新显示验证失败的表单。因此,Html Helpers实际上在ModelState中检查要在模型中查看之前在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。