2010-01-10 13 views
5

Mein Setup:Soll RenderAction mit Formularen verwendet werden?

  • haben einen Blick für eine Strecke wie: /Pages/Details/2
  • Die Seite Details zu sehen <% Html.RenderAction("CreatePageComment", "Comments"); %> Kommentar Formular
  • Kommentarformular Beiträge zu Comments/CreatePageComment
  • /Comments/CreatePageComment kehrt zu machen hat RedirectToAction Wenn ein Kommentar erfolgreich erstellt wurde
  • Das funktioniert alles gut

Meine Frage:

Wenn es einen Fehler bei der Überprüfung ist, wie soll ich zu /Pages/Detail/1 zurückzukehren und den Fehler in der Kommentarfunktion zeigen?

  • Wenn ich RedirectToAction verwende, scheint es Validierung ist schwierig; Soll ich das Post-Redirect-Get-Muster für Validierungsfehler verwenden, anstatt es einfach zurückzugeben?
  • Wenn ich View() zurückkehren es schlägt mich zurück CreateComment.aspx Ansicht zeigt (mit Validierung, sondern nur ein Formular auf einer weißen Seite), nicht die /Pages/Details/2 Route, die die RenderAction genannt.
  • Wenn das PRG-Muster verwendet werden soll, dann denke ich, ich muss nur lernen, wie Validierung während der Verwendung von PRG zu tun. Wenn nicht — und mir scheint dies besser behandelt durch die Rückkehr View() — dann weiß ich nicht, wie man den Benutzer in die ursprüngliche Ansicht zurück, zeigt die Formularfehler, während RenderAction.

    Das fühlt sich an wie das Spiel, bei dem man sich den Kopf klopft und gleichzeitig den Bauch reibend. Ich war auch nicht gut darin. Ich bin neu bei MVC, das ist wahrscheinlich das Problem hier.

    +0

    BTW: Ich könnte dies nur durch eine partielle und eine POST-Route/Seite/CreateComment geschehen lassen, aber scheint das nicht chaotisch? Ich möchte, dass mein Kommentar-Controller Kommentare verarbeitet, nicht den Page-Controller. Seltsamerweise habe ich gerade den Oxite-Blog-Engine-Code überprüft, und ihr Post-Controller übernimmt das Hinzufügen von Kommentaren; Ihr Comments-Controller hat nicht einmal eine Create-Aktion! –

    Antwort

    5

    Ich glaube, die Antwort ist TempData zu verwenden, zum Beispiel:

    Meiner Ansicht nach (/ Stufen/Details) Ich habe:

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

    In meinen Kommentare Controller ich meine POST-Methode habe:

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

    auch in den Kommentaren Controller ist mein GET-Methode:

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

    Dies funktioniert gut für mich, aber ich würde auf dem Feedback zu schätzen wissen, ob dies eine gute Praxis, usw.

    Auch bemerkte ich, dass MvcContrib eine ModelStateToTempData Dekoration hat sich diesen, sondern in einer sauberere Art und Weise zu tun, erscheint . Ich werde das als nächstes versuchen.

    +0

    Ich habe ein ähnliches Problem von dem, was Sie hatten. Die Lösung, die Sie vorschlagen, scheint zu funktionieren, aber ich bin neugierig, ob es nicht eine sauberere Art und Weise zu tun ist. Für mich scheint Ihre Lösung eher ein Hack als eine echte Lösung zu sein. Ich weiß nicht, ob jemand anderes dazu eine andere Meinung hat. – Melursus

    +0

    Ja, es fühlt sich hackisch an, aber das ist alles, was ich finden konnte, das funktioniert. Wie Sie würde ich eine sauberere Lösung begrüßen. –

    +0

    In meiner Forschung finde ich, dass MvcContrib-Bibliothek etwas SubController rufen, das vielleicht dieses Problem lösen kann. Ich schaue nicht weiter, aber es scheint interessant zu sein. – Melursus

    Verwandte Themen