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