C# ASP.NET MVC是否形成自动发布字段?

C# ASP.NET MVC是否形成自动发布字段?,c#,asp.net-mvc,http-post,C#,Asp.net Mvc,Http Post,我有一张像 @using (Html.BeginForm("create", "Account", FormMethod.Post, new { id = "accountform_form" })) { @Html.TextBoxFor(e => e.ShipFirstName) ... } 在测试过程中,我惊讶地发现,即使我没有将字段指定给视图模型,字段在回发时也保留了它的值。使用调试器,ShipFirstName的值在返回视图时正好位于操作的末尾,因此为什么它会显示

我有一张像

@using (Html.BeginForm("create", "Account", FormMethod.Post, new { id = "accountform_form" }))
{
    @Html.TextBoxFor(e => e.ShipFirstName)
    ...
}
在测试过程中,我惊讶地发现,即使我没有将字段指定给视图模型,字段在回发时也保留了它的值。使用调试器,
ShipFirstName
的值在返回视图时正好位于操作的末尾,因此为什么它会显示字段中的值?我是否一直在不必要地为视图模型属性分配过账值?还是有别的事情发生了

更新:动作就像这样

[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

我今天早些时候遇到了类似的情况(总是选中了复选框)。看看这是否相似


基本上调用ModelState.Clear()为我解决了这个问题。

今天早些时候我遇到了类似的问题(总是选中复选框)。看看这是否相似


基本上调用ModelState.Clear()为我解决了这个问题。

当您在发布模型后将其传递回视图时,MVC采取了您这样做的立场,因为表单包含错误。因此,它不是让用户再次填写表单,而是使用
ModelState
集合重新填充表单。在本例中,
ModelState
集合中的值优先于您在操作中所做的更改(这确实有点奇怪)

您可以通过调用或使用来解决此问题,其中
key
是属性的名称

如果您想全面解释为什么会出现这种情况,请参阅。摘录:

为什么? ASP.NET MVC假定,如果您正在呈现一个视图以响应HTTP POST,并且您正在使用Html帮助程序,那么您很可能正在重新显示一个验证失败的表单。因此,Html帮助程序实际上在查看模型之前在ModelState中签入要在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息


当您在发布模型后将其传递回视图时,MVC会采取您这样做的立场,因为表单包含错误。因此,它不是让用户再次填写表单,而是使用
ModelState
集合重新填充表单。在本例中,
ModelState
集合中的值优先于您在操作中所做的更改(这确实有点奇怪)

您可以通过调用或使用来解决此问题,其中
key
是属性的名称

如果您想全面解释为什么会出现这种情况,请参阅。摘录:

为什么? ASP.NET MVC假定,如果您正在呈现一个视图以响应HTTP POST,并且您正在使用Html帮助程序,那么您很可能正在重新显示一个验证失败的表单。因此,Html帮助程序实际上在查看模型之前在ModelState中签入要在字段中显示的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息


这是正在运行的模型绑定器。没有MVC不会自动填充任何内容,您通过调用TextBoxFor告诉它使用视图模型填充字段,但在操作的最后一步,
返回视图(模型)
模型。ShipFirstName
为空。这是正在运行的模型绑定器。没有MVC不会自动填充任何内容,您通过调用TextBoxFor告诉它用视图模型填充字段,但在操作的最后一步,
返回视图(模型)
模型。ShipFirstName
是空的。@CodeCaster我不太介意这个想法本身。真正的问题是在官方的MVC教程中绝对没有提到它。如果从一开始就提到它,人们会对正在发生的事情有更好的理解。此外,这将为我们提供一个简单的链接,以查找和添加此类问题。五年后,请重新投票。在我找到这个之前,我花了半天的时间试图调试令人费解的不当行为。@CodeCaster我并不介意这个想法本身。真正的问题是在官方的MVC教程中绝对没有提到它。如果从一开始就提到它,人们会对正在发生的事情有更好的理解。此外,这将为我们提供一个简单的链接,以查找和添加此类问题。五年后,请重新投票。在我发现这个之前,我花了半天的时间试着调试令人费解的不当行为。