Asp.net mvc 生成的视图中的模型值错误

Asp.net mvc 生成的视图中的模型值错误,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,在使用MVC3和razor时遇到了一个非常奇怪的问题 我正在组装的应用程序显示了一系列面试问题。我有一个问题的视图(问题的内容来自viewmodel)。因此,在我从一个问题发回后,我可能会返回相同的问题视图(但使用不同的viewmodel实例) 在viewmodel中,我有一个长属性,如下所示: public long QuestionID { get; set; } 我试图使用隐藏的输入字段在视图中存储值: @Html.HiddenFor(m => m.QuestionID) 我的问

在使用MVC3和razor时遇到了一个非常奇怪的问题

我正在组装的应用程序显示了一系列面试问题。我有一个问题的视图(问题的内容来自viewmodel)。因此,在我从一个问题发回后,我可能会返回相同的问题视图(但使用不同的viewmodel实例)

在viewmodel中,我有一个长属性,如下所示:

public long QuestionID { get; set; }
我试图使用隐藏的输入字段在视图中存储值:

@Html.HiddenFor(m => m.QuestionID)
我的问题是,当我从一个问题转到另一个问题时,隐藏字段在最终生成的html中并没有改变。它仍然是所有后续问题中第一个问题ID的值。所有其他内容的变化都很好,我还有一些其他隐藏字段工作正常。我已经在生成模型的控制器中验证了正确的值。我可以在razor文件中设置一个断点,我可以看到模型是正确的QuestionID。我也尝试过使用@Html.TextBoxFor,我也遇到了同样的问题。当我手动创建一个像下面这样的隐藏字段时,效果很好,这才是真正困扰我的地方

<input type="hidden" id="QuestionID" name="QuestionID" value="@Model.QuestionID" />


知道为什么会发生这种情况吗?

在表单发布之后,MVC会在
ModelState
中跟踪发布的值。即使您更改了模型的值,
HiddenFor
帮助程序也将首先使用
ModelState
值。这是因为绑定可能已失败,或者绑定可能是一个复杂的对象,
ModelState
中的字符串值就是它们实际输入的值

您可以使用

ModelState.Remove("QuestionID");
或者,如果你真的想把它当作一个全新的页面

ModelState.Clear();

您的url路由是否包含questionID参数?如果是这样,它是否设置为新值?这非常有趣。听起来正是问题所在。我明天会在我的另一台机器上进行验证。那就修好了,谢谢。虽然我仍然觉得奇怪,其他领域的变化没有问题。。。