2017-12-21 32 views
0

検証エラーの後、自分のモデルをビューに戻したいと思います。 ASP.NET MVC適切なURLを取得するために、モデルを渡す別のアクションにリダイレクトしたい

[HttpPost] 
    [Authorize] 
    public ActionResult CreateIncident(IncidentModel incident) 
    { 
     if (ModelState.IsValid) 
     { 
      string response = _incidentService.CreateIncident(incident).Value; 
      if (response.Length == 15) 
      { 
       TempData["Message"] = String.Format($"Le ticket {response} a bien été réceptionné par l'équipe support"); 
       TempData["Class"] = "success"; 
      } 
      else 
      { 
       TempData["Message"] = "Une erreur est survenue lors de la création de l'incident"; 
       TempData["Class"] = "warning"; 
      } 

      return RedirectToAction("Index"); 
     } 

     TempData["Message"] = "Attention, vous n'avez pas saisi toutes les informations requises."; 
     TempData["Class"] = "warning"; 

     return View("Index", incident); 
    } 

、間違った検証の場合には戻って私の見解に私のモデルを送ることになっている:これを実行するには、私が検証をチェックするアクションを呼び出し

[Authorize] 
    public ActionResult Index() 
    { 
     ViewBag.Title = "Karanga"; 
     return View("Index", new IncidentModel()); 
    } 

私は自分の投稿を同じビューにモデルから。

ここで問題となるのは、私のURLが/インシデント/インデックス(デフォルトルート)であり、すべて正常です。 しかし、私はCreatIncident()を呼び出し、私のURLは/Incident/CreateIncidentのようになります。 アクティブなメニューボタンを設定するために使用するので、実際には正しいことが本当に必要です。

アクションインデックスにリダイレクトしようとしましたが、私のモデルがキャッシュに保存されることを期待していましたが、それが機能していれば、私はここで助けを求めていません。

私のモデルをパラメータとして渡すことは可能ですか?

これを修正できる方法については、私のモデルをTempDataに渡さずに、アクションインデックスにリダイレクトしてください(しかし、他の解決策がない場合、私はそれを実行します)。

+0

インデックスビューを固定したままで、その下の小さなビューを切り替える場合は、 @Ajax.BeginFormとPartialViewsの検索は有益かもしれません。ただし、PartialViewを返すRedirectToActionを使用すると、URLを元のままにしてインデックスをそのまま残す必要があります。それはあなたが望むものかもしれないし、そうでないかもしれませんか? –

+0

モデルをキャッシュに保存しないでください。これは悪い考えです。そして、あなたはモデルをパラメータとして 'ActionResult'に渡すことができます。 – akasoggybunz

+0

GETメソッドに合うように、postメソッドの名前を 'public ActionResult Index(IncidentModel incident)'に変更してください(またはGETメソッドを変更するメソッドを 'public ActionResult CreateIncident()'に置き換えます –

答えて

0

インデックスメソッドを二重にすることはできますか?このような何か:

[HttpPost] 
[Authorize] 
public ActionResult Index(IncidentModel incident = null) 
{ 
    if (incident == null) { 
     ViewBag.Title = "Karanga"; 
     return View("Index", new IncidentModel()); 
    } 

    if (ModelState.IsValid) 
    { 
     string response = _incidentService.CreateIncident(incident).Value; 
     if (response.Length == 15) 
     { 
      TempData["Message"] = String.Format($"Le ticket {response} a bien été réceptionné par l'équipe support"); 
      TempData["Class"] = "success"; 
     } 
     else 
     { 
      TempData["Message"] = "Une erreur est survenue lors de la création de l'incident"; 
      TempData["Class"] = "warning"; 
     } 

     return RedirectToAction("Index"); 
    } 

    TempData["Message"] = "Attention, vous n'avez pas saisi toutes les informations requises."; 
    TempData["Class"] = "warning"; 

    return View("Index", incident); 
} 

次にフォームのアクションは次のようになります。

@using(Html.BeginForm("Index")) { 
... 
} 
我々はデータをポストが、我々は、フォームデータをつかむだろう画面をリロードしないと、送信したい私たちのアプリケーションでは

JavaScriptポストを使用してサーバーに送信します。クライアント・ページが変更されたり再ロードされたりしない間に、サーバーは最新のデータで更新されます。

これにより、サーバーから結果をJsonとして取得し、必要に応じてフォームフィールドや読み取り専用の値を更新することもできます。

関連する問題