在控制器中设置的模型属性未显示在视图中

时间:2012-04-20 15:05:06

标签: .net asp.net-mvc

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

控制器

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

键入的视图包含someProperty的隐藏字段

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

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

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

这对我来说似乎并不严谨。任何见解? THX

2 个答案:

答案 0 :(得分:4)

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

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

    ModelState.Remove("someProperty");    

    return view(myModel);
}

答案 1 :(得分: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