2017-12-21 9 views
0

Ich möchte mein Modell nach einem Validierungsfehler meine Ansicht zurückgeben. Um dies durchzuführen, nenne ich die Aktion, die Validierung überprüft:ASP.NET MVC Ich würde gerne zu einer anderen Aktion umleiten mein Modell, um die richtige URL zu erhalten

[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); 
    } 

Und sollte mein Modell schicken zurück zu meiner Ansicht bei falscher Validierung:

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

zu der gleichen Ansicht, die ich habe meine Modell von.

Das Problem hier ist, wenn ich Index() meine URL anrufen ist /Incident/Index (Standardroute) und alles ist in Ordnung. Aber dann rufe ich CreatIncident() und meine URL wird wie /Incident/CreateIncident. Ich brauche es wirklich, um richtig zu sein, weil ich es verwende, um den aktiven Menüknopf zum Beispiel zu setzen.

Ich versuchte umleiten zu Aktion Index, in der Hoffnung, dass mein Modell im Cache gespeichert werden könnte, aber wenn es funktioniert hat, würde ich hier nicht um Hilfe bitten.

Ist es möglich, mein Modell als Parameter weiterzuleiten?

Wenn Sie irgendeine Idee haben, wie ich das beheben kann, indem ich zum Aktionsindex umadressiere, vorzugsweise ohne mein Modell in den TempData zu übergeben (aber wenn es keine andere Lösung gibt, werde ich es tun), wird es helfen.

+0

Sie möchten, dass die Indexansicht dauerhaft bleibt und kleinere Ansichten darunter angezeigt werden? Eine Suche auf @ Ajax.BeginForm und PartialViews kann von Vorteil sein. Sie können RedirectToAction verwenden, das eine PartialView zurückgibt, damit die URL jedoch intakt bleibt, müssen Sie den Index intakt lassen. Das kann oder darf nicht das sein, was Sie wünschen? –

+0

Speichern Sie kein Modell im Cache. Das ist eine schlechte Idee. Und ja, Sie können ein Modell als Parameter an ein 'ActionResult' übergeben. Verwenden Sie 'return View (" Index "," Incident ", neues {Model});' – akasoggybunz

+0

Folgen Sie einfach der Konvention und benennen Sie die Post-Methode in 'public ActionResult Index (IncidentModel Incident)' um die GET-Methode (oder ändern Sie die GET Methode zu 'öffentlichen ActionResult CreateIncident()' –

Antwort

0

Könnten Sie Ihre Index-Methode doppelt machen? Etwas wie folgt aus:

[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); 
} 

Dann Formular Aktion wäre:

@using(Html.BeginForm("Index")) { 
... 
} 

In unseren Anwendungen, bei denen wir die Daten schreiben möchten, aber nicht auf den Bildschirm neu laden wir die Formulardaten greifen werden, und senden es auf den Server mit einem JavaScript-Post. Dann wird der Server mit den neuesten Daten aktualisiert, während die Clientseite nicht geändert oder neu geladen wurde.

Dadurch können Sie auch das Ergebnis vom Server als Json abrufen und alle Formularfelder oder Read/Only-Werte nach Bedarf aktualisieren.

Verwandte Themen