【问题标题】:Does ASP.NET MVC form post autopopulate fields?ASP.NET MVC 表单是否发布自动填充字段?
【发布时间】:2013-11-21 22:34:24
【问题描述】:

我有一个类似...的表格

@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

【问题讨论】:

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


【解决方案1】:

我今天早些时候遇到了类似的事情(总是选中一个复选框)。看看Changing ViewModel properties in POST action 看看这是否相似。

基本上调用 ModelState.Clear() 为我修复了它。

【讨论】:

    【解决方案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,并且您正在使用 Html 帮助程序,那么您很可能会重新显示一个验证失败的表单。因此,Html Helpers 在查看 Model 之前实际上会在 ModelState 中检查要在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。

    【讨论】:

    • @CodeCaster 我并不介意这个想法本身。真正的问题是在官方 MVC 教程中绝对没有提到它。如果一开始就提到它,人们就会更好地了解正在发生的事情。此外,它还为我们提供了一个简单的链接来查找和添加此类问题。
    • 五年后重新投票。在我发现这个之前,我花了半天时间尝试调试莫名其妙的不当行为。
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多