我有一个包含多个字段的模型的视图.当我在GET上渲染视图时,我有一个隐藏字段,存储一个此时为空的代码.然后我POST并在操作中通过模型向此代码字段添加值并将模型发送到视图,如:
return View (model);
Run Code Online (Sandbox Code Playgroud)
当视图呈现时,隐藏字段没有代码值,但视图确实包含在第一步中输入的所有其他值.所以现在当我发布第二个按钮时,传递给动作的模型不包含我在第一个帖子响应时传递给它的隐藏代码值.
如果我在第一篇文章中更新了模型,并将其发送回具有新值的视图,那么我是否应该将该代码存储在视图中的隐藏输入中并且能够将其再次发回到该操作中?
我还意识到,如果我更改第一篇文章中的任何模型字段并将更新的模型发送到视图,它将仅保留第一个POST操作的值.我这里有缓存问题吗?我该如何管理这种行为?谢谢
在更改POST操作中的值之前,应将其从ModelState中删除:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// update the value of the model that was POSTed to some new value
model.SomeProperty = "some new value";
// remove POSTed value from the modelstate if you intend to modify it here
ModelState.Remove("SomeProperty");
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
你需要做的原因是因为HTML辅助,例如Html.HtextBoxFor, Html.HiddenFor,...绑定,然后从你的模型中的价值时,首先从ModelState中使用的值.如果不从ModelState中删除该值,则HiddenFor帮助程序将使用原始POSTed值,该值为空字符串,而不是您在操作中修改的值.