2017-09-01 3 views
0

私はいくつかの部分で完成したフォームを持つプロジェクトを持っています。例えば。パート1にはあなたの名前が含まれ、パート2にはあなたの住所が含まれる場合があります。ポストリダイレクト - 長い/ウィザードスタイルのフォームでパターンを取得する

MVCには、すべてのフォームデータを保持するための各パーツと1つのモデルを表すいくつかのビューがあります。

私は、各パーツの完成時にフォームデータを保存し、次のパーツで保存されたレコードを取り出すことができます(モデル全体が各段階で利用可能になります)。

バックとフォワードボタンを使用してブラウザから「フォームが再送信される可能性があります」という警告が表示されないように、Post-Redirect-Getを使用しています。

コントローラー・コード

[HttpGet] 
[Route("Form/Part/{id}")] 
public ActionResult Part(int id, int? recordId) 
{ 
    var model = new MyVM(); 
    if(recordId.HasValue) { 
     // get record from DB 
     // map record to 'model' 
    } 
    return View("Form.{id}", model); 
} 

[HttpPost] 
[Route("Form/Part/{id}")] 
public ActionResult Part(int id, MyVM model) 
{ 
    // map model to entity 
    // save/update entity 
    return RedirectToAction($"Form/Part/{id + 1}", new { recordId = recordId }) 
} 

私の質問は、新しく作成された/更新されたレコードのIDを保持し、次のフォームの部分にそれを渡す方法がベストです。私は失われた戻るボタンクエリ文字列でrecordIdなどのブラウザを使用する場合recordIdrouteValueとして作品を渡すと、それが壊れるなくなり

私はこのセッションをおそらく保存することを検討していますが、テストの理由からを再生したいとは思わないでしょう。

このようなことを達成するための推奨方法はありますか?現在の記録を把握するための様々な方法についての考えは大変高く評価されます。

+0

クッキーと考えることができます(また、 'id'が' null'の場合は、その値をクッキーでチェックしてください)。また、現在のステップを追加して、ユーザーがログオフしてから後で完了するように戻ってきてもよい(最後のステップで削除する) –

答えて

1

TempDataまたはSessionを使用して、リクエスト間でデータを渡すことができます。

ウィザードのすべてのフィールドを持つ大きなクラス/オブジェクトを作成し、セッションの「MyWizardData」キーなどにスローし、ウィザードの他の部分で取得します。

保存/更新エンティティ

//

した後は、セッション中にそれを投げると、次のアクションに戻ってそれをつかむ、IDを持っています。

セッションを使用したくない場合は、保存/更新後にIDを取得し、userテーブルのデータベースのフィールドに格納します。または、作成したエンティティ行にUserIdを格納するだけです。それで、あなたはどんな行動でもそれをつかむことができます。

関連する問題