2016-06-23 16 views
2

現在、私は、ViewModelを別のActionに渡す際にTempDataを使用しています。TempDataを使用せずにActionResults間でViewModelを渡す

しかし私の同僚は、LoadBalancers以前はTempDataの使用に問題があったため、TempDataを使用すべきではないと私に忠告しました。

ここに私のコントローラの一部があり、私がしたいことが分かります。 TempDataまたはSessionを使用せずに同じプロセスをどのように達成できますか。 お知らせください、ありがとうございます!

public ActionResult Create() 
{ 
    MyViewModel viewModel; 

    if (TempData["viewModel"] != null) 
    { 
     viewModel = (MyViewModel)TempData["viewModel"]; 
     //code for getting dropdownlist to show to view 

     return View(viewModel); 
    } 

    viewModel = new RequestViewModel(); 
    //code for getting dropdownlist to show to view 

    return View(viewModel); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(MyViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //collect data, but not yet save to database 

     TempData["viewModel"] = viewModel; 

     return RedirectToAction("Confirm"); 
    } 

    //code to get errors, and dropdownlist items to re-show to view 
    return View(viewModel); 
} 

public ActionResult Confirm() 
{ 
    if (TempData["viewModel"] != null) 
    { 
     var viewModel = (MyViewModel)TempData["viewModel"]; 

     return View(viewModel); 
    } 

    return RedirectToAction("Create"); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Confirm(MyViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //save data to database if confirmed 

     return View(viewModel); 
    } 

    return RedirectToAction("Create"); 
} 

--EDIT--

私は、パラメータを経由してredirectToActionへのViewModelを渡そうとしましたが、私のViewModelは、リダイレクト後に再投入しませんでした。コード:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(MyViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //collect data, but not yet save to database 

     return RedirectToAction("Confirm", viewModel); 
    } 

    //code to get errors, and dropdownlist items to re-show to view 
    return View(viewModel); 
} 

public ActionResult Confirm(MyViewModel viewModel) 
{ 
    if (viewModel != null) 
    { 
     //some code 

     return View(viewModel); 
    } 

    return RedirectToAction("Create"); 
} 

[HttpPost] 
[ActionName("Review")] 
[ValidateAntiForgeryToken] 
public ActionResult ConfirmPost(MyViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //save data to database if confirmed 

     return View(viewModel); 
    } 

    return RedirectToAction("Create"); 
} 

答えて

2

ページロードのチェック方法は、あなたがあなたの状況に

return View("Check", viewmodel); 
+0

いいえは、すべての入力が正しい場合、ユーザーはチェックところViewがあるか確認してください。いずれかのユーザーが、キャンセルボタンを表示して、確認ボタンを押して続行します。 – jomsk1e

+0

ご迷惑をおかけして申し訳ございませんが新しいビューを確認しますか? –

+0

はい、チェックはユーザーが入力を検証してから続行するかどうかを決定できる新しいビューです。 – jomsk1e

0

問題を使用することができなかった、何もするが、ビューを返さないと仮定すると、実際に起因することをTempDataをサーバセッションを使用してコンテンツを格納します。これは、マルチサーバ環境で問題になります。代わりにクッキーを使用するために独自のtempdataプロバイダを実装することができます。いくつかの可能な解決策:

https://stackoverflow.com/a/28355862/1942895

https://brockallen.com/2012/06/11/cookie-based-tempdata-provider

http://vijayt.com/Post/Custom-TempDataProvider-for-Azure

関連する問題