如何更新文本框值@ Html.TextBoxFor(m => m.MvcGridModel.Rows [j] .Id)

时间:2012-07-05 09:32:32

标签: asp.net-mvc-3 html.textboxfor

我有问题,文本框值没有使用模型中的新值更新。 @ Html.TextBoxFor(m => m.MvcGridModel.Rows [j] .Id)

首先,集合MvcGridModel.Rows会填充一些数据,然后当按下按钮并提交表单时,它会成功获取新数据,但它不会更新文本框的值。

你有什么想法吗? 提前谢谢你

1 个答案:

答案 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");
}