ASP.NET MVC是否构成自动填充字段?

时间:2013-11-21 22:34:24

标签: c# asp.net-mvc http-post

我的表格很像......

@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

2 个答案:

答案 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中检查要在模型中查看之前在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。