5 Stimmen

Sollte RenderAction mit Formularen verwendet werden?

Meine Einstellung:

  • Haben Sie einen Blick für eine Route wie: /Pages/Details/2
  • Die Seitendetailansicht hat <% Html.RenderAction("CreatePageComment", "Comments"); %> um ein Kommentarformular zu erstellen
  • Das Kommentarformular sendet an Comments/CreatePageComment
  • /Comments/CreatePageComment gibt zurück. RedirectToAction wenn ein Kommentar erfolgreich erstellt wurde
  • Das alles funktioniert gut

Meine Frage:

Wenn ein Überprüfungsfehler auftritt, wie soll ich dann zu /Pages/Detail/1 und den Fehler im Kommentarformular anzeigen?

  • Wenn ich die RedirectToAction Es scheint, dass die Validierung schwierig ist; sollte ich sogar das Post-Redirect-Get-Muster für Validierungsfehler verwenden, anstatt einfach zurückzukehren?
  • Wenn ich zurückkehre View() wird wieder die Anzeige der CreateComment.aspx Ansicht (mit Validierung, aber nur ein Formular auf einer weißen Seite), nicht die /Pages/Details/2 Route, die die RenderAction .

Wenn das PRG-Muster verwendet werden soll, dann muss ich wohl lernen, wie man die Validierung mit PRG durchführt. Wenn nicht - und das scheint mir besser durch die Rückgabe von View() - dann weiß ich nicht, wie man den Benutzer zurück zu der ursprünglichen Ansicht zu bekommen, zeigt die Form Fehler, während mit RenderAction .

Das fühlt sich an wie das Spiel, bei dem man gleichzeitig den Kopf antippt und den Bauch reibt. Darin war ich auch nicht gut. Ich bin neu bei MVC, also ist das wahrscheinlich das Problem hier.

5voto

Roger Rogers Punkte 525

Ich glaube, die Antwort ist die Verwendung von TempData, zum Beispiel:

Aus meiner Sicht (/Schritte/Details) habe ich:

<!-- List comments -->
<% Html.RenderAction("List", "Comments", new { id = Model.Step.Id }); %>

<!-- Create new comment -->
<% Html.RenderAction("Create", "Comments", new { id = Model.Step.Id }); %>

In meinem Kommentar-Controller habe ich meine POST-Methode:

    // POST: /Comments/Create
    [HttpPost]
    public ActionResult Create([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate)
    {
        if (ModelState.IsValid)
        {
            //Insert functionality here

            return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId });

        }

    //If validation error
        else
        {

            //Store modelstate from tempdata
            TempData.Add("ModelState", ModelState);

            //Redirect to action (this is hardcoded for now)
            return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId });
        }
    }

Meine GET-Methode befindet sich ebenfalls im Kommentar-Controller:

    //
    // GET: /Comments/Create

    public ActionResult Create(int id)
    {

        if (TempData.ContainsKey("ModelState"))
        {
            ModelStateDictionary externalModelState = (ModelStateDictionary)TempData["ModelState"];
            foreach (KeyValuePair<string, ModelState> valuePair in externalModelState)
            {
                ModelState.Add(valuePair.Key, valuePair.Value);
            }
        }
        return View(new Comment { StepId = id });
    }

Das funktioniert bei mir hervorragend, aber ich würde mich über Rückmeldungen freuen, ob dies eine gute Praxis ist usw.

Außerdem habe ich bemerkt, dass MvcContrib eine ModelStateToTempData Dekoration hat, die dies zu tun scheint, aber auf eine sauberere Weise. Ich werde versuchen, dass nächste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X