2

注文と注文行を保持するモデルがあります。ユーザーがフォームを送信すると、ポストバックで行分割が行われ、モデルと行が再構築されます。問題は、隠しフィールドがリスト内のインデックスに基づいて値を取得することです (これについての投稿を見たことがあります)。

いくつかのコード:

Orderview to display the rows:
@Html.EditorFor(r => r.Rows)

OrderRowModel のエディター

@Model.ItemNo @Html.HiddenFor(r => r.Id) @Html.HiddenFor(r => r.RowNumber)

コントローラーで更新するための疑似コード

foreach(var r in model.Rows)
{
  if(qty>0) { 
    string errormsg = UpdateRow(r);
    if(!string.IsNullOrEmpty(errormsg))
       ErrorMsgList.Add(r.RowNo, errormsg);
  }
}
var reloadedModel = ReloadOrderAndRows(model.OrderNo);
foreach(var r in reloadedModel.Rows)
{
   if(HasError(r.RowNo, ErrorMsgList))
     r.Error = GetError(r.RowNo, ErrorMsgList);
}
return View(reloadedModel);

3 行 (10、20、30) の注文があり、ユーザーは行 20 を数量で更新し、ポストバックを実行します。行を保存しますが、一部のビジネス データに基づいて、行は行 20 と 21 に分割されます モデルでは、モデル全体をリロードしてビューに送信します ビューには 4 行 (10、20、21、30) が表示されますが、 21 の非表示ボックスの ID は 30 です (以前は 30 がリストの位置 2 にあったため)。すべてのデータ フィールド qty と表示フィールドは正しいです。間違った値を取得するのは隠しフィールドです (関数のエディターに変更しても)。

したがって、フォームが再度送信されると、間違った行が更新されます。

では、ポストバック後に元のビューにリダイレクトしないのはなぜですか? 更新が失敗した場合、リロードされた RowModel にデータを設定します。また、リダイレクトを行うと、行レベルで設定されたすべての詳細が失われます。

行番号に関連する入力フィールドに一意のIDを指定するか、ポストバックの結果であることをmvcに忘れさせる必要があります。リロードされたモデルの値が正しいことがわかります。私の値を設定するビューステートがあるようです。

*まだ自分の質問に答えることができないので、編集で答えます*

わかりました。値を保持するのは ModelState でした。RowNo の出力を行った場合、正しい値が得られましたが、入力はモデル状態によって更新されました。したがって、私が今行ったことは、ビューを返す前に ModelState.Clear() を呼び出すことでした。

私が考えることができる唯一の損失は、エラーが発生した場合に数量が保存されないことです。コントローラーのモデルに値を設定することで修正できます。

ModelState.Clear()
4

0 に答える 0