1

テキストボックスの値がモデルの新しい値で更新されないという問題があります。@ Html.TextBoxFor(m => m.MvcGridModel.Rows [j] .Id)

最初にコレクションMvcGridModel.Rowsにデータが入力され、ボタンを押してフォームを送信すると、新しいデータが正常に取得されますが、テキストボックスの値は更新されません。

あなたはなにか考えはありますか?よろしくお願いします

4

1 に答える 1

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からすべてのキーを削除するために使用できる方法もありModelState.Clear();ますが、これにより関連するmodelstateエラーも削除されるため、注意してください。したがって、POSTコントローラーアクション内で変更する予定の値のみをModelStateから削除することをお勧めします。

とはいえ、適切に設計されたアプリケーションでは、これは必要ありません。PRGパターンを使用する必要があるため:

[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");
}
于 2012-07-05T09:35:25.123 に答える