5

[ImportModelStateFromTempData]および[ExportModelStateToTempData]アクション フィルターを使用して PRG パターンを実装しようとしています。このパターンはフラット モデルには最適ですが、子コレクションがある場合は機能しません。私のモデルは次のようになります。

public class QuestionModel
{
    public string QuestionText { get; set; }

    public ICollection<ChoiceModel> Choices { get; set; }
}

public class ChoiceModel
{
    public string ChoiceText { get; set; }
}

私のコントローラーは次のとおりです。

[HttpGet, ImportModelStateFromTempData]
public ActionResult Create()
{
    return View();
}

[HttpPost, ExportModelStateToTempData]
public ActionResult Create(QuestionModel model)
{
     if(ModelState.IsValid)
     {
        // not getting here
     }

     return RedirectToAction("Create");
}

私のビューでは、ユーザーが選択肢に新しい項目を追加できるようになっており、選択肢は一意でなければならないという検証があります。ModelState が有効でない場合、ModelState を TempData にパッケージ化し、HttpGet アクションにリダイレクトします。

この時点で、すべての子モデルの値は ModelState にありますが、モデルをビューに渡すときに再構築されないため、ビューには追加された子が 0 であることが示されます。

ModelState をモデルとマージする方法はありますか、またはこのパターンを子オブジェクトで使用できませんか?

4

2 に答える 2

1

[ImportModelStateFromTempData]モデルを再構築するかどうかは疑わしいです。ユーザーが試行した値検証エラーModelStateを取得するだけで画像を作成します。この時点(GET)でモデルコレクションが初期化されておらず、POSTからコレクションを渡していないため、レンダリングされるだけです。モデルの初期状態。これがフラットモデルではうまく機能しますが、この場合のようなコレクションでは機能しない理由です。

したがって、そのコレクションまたはホールモデルをPOSTからGETアクションに渡す方法を見つける必要があります。オプションはTempDataです。

//POST - if validation fails
TempData["model"] = model;

//GET - must check if TempData["model"] is null first
QuestionModel model = (QuestionModel)TempData["model"];
于 2013-01-15T16:57:02.467 に答える
0

ModelStateTempDataTransfer テンプレート onActionExecution を使用する必要があるこのリンク http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prgを確認してください。

于 2013-01-15T16:41:34.933 に答える