1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVC - RedirectToActionでModelStateエラーを保存する方法は?

2023-01-08 12:20:11

質問

以下の2つのアクションメソッドがあります(質問のため簡略化しています)。

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   // get some stuff based on uniqueuri, set in ViewData.  
   return View();
}

[HttpPost]
public ActionResult Create(Review review)
{
   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}

というわけで、バリデーションが通ったら、別のページ(確認ページ)にリダイレクトします。

エラーが発生した場合は、エラーが発生したページと同じページを表示する必要があります。

もし私が return View() を実行すると、エラーが表示されます。 return RedirectToAction (を実行すると、Modelのエラーは表示されなくなります。

私はこの問題に驚いていません。ただ、皆さんがこれをどのように扱っているのかが気になります。

もちろん、リダイレクトの代わりに同じビューを返すこともできますが、私はビューデータを入力する "Create" メソッドにロジックを持っており、それを複製する必要があります。

何か提案はありますか?

どのように解決するのですか?

同じインスタンスの Review の上に HttpGet アクションに追加します。 これを行うには、オブジェクト Review review をtemp変数に保存してください。 HttpPost アクションでそれを復元し HttpGet アクションにリストアします。

[HttpGet]
public ActionResult Create(string uniqueUri)
{
   //Restore
   Review review = TempData["Review"] as Review;            

   // get some stuff based on uniqueuri, set in ViewData.  
   return View(review);
}
[HttpPost]
public ActionResult Create(Review review)
{
   //Save your object
   TempData["Review"] = review;

   // validate review
   if (validatedOk)
   {
      return RedirectToAction("Details", new { postId = review.PostId});
   }  
   else
   {
      ModelState.AddModelError("ReviewErrors", "some error occured");
      return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
   }   
}

の最初の実行の後にブラウザがリフレッシュされても動作するようにしたい場合。 HttpGet アクションの最初の実行後にブラウザがリフレッシュされた場合でも動作させたい場合は、このようにします。

  Review review = TempData["Review"] as Review;  
  TempData["Review"] = review;

その他、リフレッシュボタンオブジェクトの場合 review には何のデータもないので、空っぽになります。 TempData["Review"] .