3

这是一个非常简单的例子。

控制器

[httppost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";
    return view(myModel)
}

类型化视图包含 someProperty 的隐藏字段

@Html.HiddenFor(model => model.someProperty)

Get 控制器将 someProperty 设置为“a”

然而,在发布之后,视图中 someProperty 的值仍然是“a”

这对我来说似乎不正确。有什么见解吗?谢谢

4

2 回答 2

4

ModelState保持过帐值“a”。并且由于它在填充模型值方面具有更高的优先级(比模型本身),视图呈现“a”。您可以从 ModelState 中删除值并使用模型值

[HttpPost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";

    ModelState.Remove("someProperty");    

    return view(myModel);
}
于 2012-04-20T15:29:35.987 回答
3

我实际上可以重现这一点(最初让我感到惊讶),但经过一番挠头后,我认为这是有道理的。

在行上设置断点myModel.SomeProperty = "b";确实表明该属性设置正确。这使我相信 MVC 是基于您将视图呈现为 POST 的直接结果(即存在现有模型状态)这一事实做出的假设。我想这是因为如果您在 POST 之后重新显示视图,则假设您这样做是因为表单包含错误。通过从模型状态中获取值,可以正确地重新填充表单以供用户重试。

编辑:当然,一旦我发布,我发现一篇文章比我能更好地描述它:http: //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net- mvc-s-html-helpers-render-the-wrong-value.aspx

于 2012-04-20T15:30:25.220 回答