使用MVC3和razor进入一个非常奇怪的问题。
我正在整理的应用程序显示了一系列面试问题。我有一个问题的观点(问题的内容来自viewmodel)。所以在我从一个问题回复后,我可能会返回相同的问题视图(但使用不同的viewmodel实例)。
在viewmodel中我有一个很长的属性:
public long QuestionID { get; set; }
我试图使用隐藏的输入字段来存储视图中的值:
@Html.HiddenFor(m => m.QuestionID)
我的问题是,当我从问题到问题时,隐藏字段在最终生成的html中没有变化。在所有进一步的问题中,它仍然是第一个questionID的值。所有其他内容都在变化,我还有一些其他隐藏的字段正常工作。我已在生成模型的控制器中验证了正确的值。我可以在剃刀文件中设置断点,我可以看到模型与正确的QuestionID一样。我尝试使用@ Html.TextBoxFor也有同样的问题。当我手动创建一个像下面这样的隐藏字段时,它工作正常,这就是我真正困扰的事情。
<input type="hidden" id="QuestionID" name="QuestionID" value="@Model.QuestionID" />
知道为什么会这样吗?
答案 0 :(得分:7)
在表单发布后,MVC会跟踪ModelState
中发布的值。即使您更改了模型的值,HiddenFor
助手也会首先使用ModelState
值。这是因为绑定可能失败,或绑定可能是一个复杂的对象,而ModelState
中的字符串值是他们实际输入的。
您可以使用
解决此问题ModelState.Remove("QuestionID");
或者,如果您真的只想将其视为一个全新的页面,
ModelState.Clear();