我有问题,文本框值没有使用模型中的新值更新。 @ Html.TextBoxFor(m => m.MvcGridModel.Rows [j] .Id)
首先,集合MvcGridModel.Rows会填充一些数据,然后当按下按钮并提交表单时,它会成功获取新数据,但它不会更新文本框的值。
你有什么想法吗? 提前谢谢你
答案 0 :(得分:3)
这是因为TextBoxFor之类的HTML帮助程序在绑定它们的值时首先在ModelState中查看,然后才在模型中查看。因此,如果您在POST操作中尝试修改属于初始POST请求的某些值,则必须将其从ModelState中删除,如果您希望这些更改在视图中生效。
例如:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// we change the value that was initially posted
model.MvcGridModel.Rows[0].Id = 56;
// we must also remove it from the ModelState if
// we want this change to be reflected in the view
ModelState.Remove("MvcGridModel.Rows[0].Id");
return View(model);
}
此行为是故意的,而且是设计使然。这是允许例如具有以下POST操作的原因:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// Notice how we are not passing any model at all to the view
return View();
}
然后在视图中,您将获得用户最初在输入字段中输入的值。
还可以使用ModelState.Clear();
方法从模型状态中删除所有键但要小心,因为这也会删除任何关联的模型状态错误,因此建议仅从ModelState中删除值您打算在POST控制器操作中进行修改。
所有这些都说,在一个设计合理的应用程序中,你不应该需要这个。因为您应该使用PRG pattern:
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
// there was some error => redisplay the view without any modifications
// so that the user can fix his errors
return View(model);
}
// at this stage we know that the model is valid.
// We could now pass it to the DAL layer for processing.
...
// after the processing completes successfully we redirect to the GET action
// which in turn will fetch the modifications from the DAL layer and render
// the corresponding view with the updated values.
return RedirectToAction("Index");
}