2009-08-19 3 views
2

Ich rendere eine Seite, wo ein Teil der Seite eine FORM ist - gerendert über eine partielle. Die Schaltfläche "Senden" auf diesem Formular wird über Ajax an meinen Controller gesendet (mit JQuery .post()). Wenn die Controller-Aktion übernimmt, gibt es zwei mögliche Ausführungspfade:Zurückgeben von Status und HTML von Ajax Post in ASP.NET MVC

  1. Die Formulardaten sind gültig. In diesem Fall aktualisiert der Controller die Datenbank mit einem neuen Datensatz und gibt dann eine HTML-Tabelle durch Rendern einer PartialView zurück (und gibt ein ViewResult zurück).

  2. Die Formulardaten sind ungültig. In diesem Fall möchte ich das ursprüngliche Formular erneut darstellen, wobei die Überprüfungsfehler hervorgehoben sind. Ich glaube, ich kann dies mit einem anderen PartialView-Aufruf tun.

Auf der Clientseite, bei der Fertigstellung JavaScript-Funktion, ich habe zwischen dem Erfolg und Misserfolg Fällen zu unterscheiden, da der DOM Ziel für den zurückgegebene HTML anders sein wird. Ich denke, ich könnte den HTML-Code auf ein bekanntes Element untersuchen, um die Fälle zu unterscheiden, aber mir erschien es besser, ein JSonResult zurückzugeben, das einen booleschen Status in einem Feld und den HTML-Code in einem anderen enthält.

Ich weiß, wie man ein JsonResult von der Steuerung zurückgibt. Allerdings muss ich in der Lage sein, den HTML-Code aus den PartialView-Aufrufen zu erfassen, um diesen Text in das Feld einzubetten. Hat jemand wissen:

(a), wie dies zu tun, und/oder

(b) ein besserer Weg, um die Situation zu nähern.

TIA

aktualisieren 8/20/2009

Ich glaube, ich bin nahe kommt, was ich mit diesem Code möchte:

 ViewEngineResult viewEngineResult = ViewEngines.Engines.FindPartialView(this.ControllerContext, "HospitalDoseList"); 
     ViewData.Model = hospitalStay; 
     ViewContext viewContext = new ViewContext(ControllerContext, viewEngineResult.View, this.ViewData, this.TempData); 
     using (StringWriter writer = new StringWriter()) { 
      viewEngineResult.View.Render(viewContext, writer); 
      string html = writer.ToString(); 
      JsonResult jsonResult = new JsonResult(); 
      jsonResult.Data = new {Status = true, Html = HttpUtility.HtmlEncode(html)}; 
      return jsonResult; 
     } 

jedoch die HTML-String aufkommt blank, wo ich erwartet habe, dass es den HTML-Code enthält, der normalerweise für den Antwortstream über einen Anruf an

01 gerendert würde
+0

Ich würde mit Ihrer Idee gehen, das Json-Ergebnis mit dem HTML und einem Status zurückzugeben, aber statt Status ein boolescher zu sein, könnte es ein wenig besser sein, es zu einer Aufzählung irgendeiner Art zu machen, falls Sie mehr als nur einen Status wollen von Erfolg/Misserfolg – cptScarlet

+0

Sicher. Das macht Sinn. Ich weiß nicht, wie ich die HTML-Zeichenfolgen aus den PartialView-Aufrufen abrufen kann. –

+0

Sorry, ich kenne MVC nicht, aber vielleicht hilft Ihnen dieser Link. http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html – cptScarlet

Antwort

1

Ich würde vorschlagen, dass es am einfachsten wäre, separate Validierungs- und Post-Aktionen zu haben, die durch den Submit-Button ausgelöst werden. Sie würden zuerst eine AJAX-Validierung/-Post durchführen, die den JSON-Status und möglicherweise ein Array von Validierungsfehlern (Strings) zurückgibt. Eigentlich würde eine leere Liste als Beweis für den Erfolg ausreichen, damit Sie den Status möglicherweise weglassen können. Sobald Sie Ihre serverseitige Validierung durchgeführt haben, rufen Sie eine andere Aktion über AJAX auf, die die anzuzeigenden Daten abrufen würde. Diese Aktion würde eine Teilansicht wiedergeben und HTML zurückgeben.

+0

Das ist eine interessante Idee. Ich möchte jedoch die Html.Validation-Erweiterungsmethoden in der Ansicht verwenden, die die Validierungsfehler im ModelState von ViewData anzeigen. –

1

Ich wollte dies in einem Kommentar bleiben, aber es war zu viel Text ...

Das Muster der Rückkehr einen Code AJAX-Status ist sehr häufig, mein Beitrag hier ansehen: jQuery AJAX Responses in ASP.NET MVC und dieser Blog-Post: http://www.bennadel.com/blog/1392-Handling-AJAX-Errors-With-jQuery.htm.

Was die Teilansicht anbetrifft, haben Sie ein wenig Pech - ViewResults muss ExecuteResult() aufgerufen haben, was dann die HTML direkt in die Antwort rendert. Sie müssen sich eine andere Strategie ausdenken, vielleicht etwas, was tvanfosson vorgeschlagen hat.

+0

Ich dachte, ich habe etwas über IView.Render gesehen, mit dem die Ansicht auf etwas anderes als den Response-Stream (z. B. einen Speicherstream) gerendert werden konnte. Ich werde noch mehr in diese Richtung graben ... –

+0

Ich habe schon gegraben ... es bringt dich leider nicht zu weit. Das Problem ist, dass PartialView.View null ist, bis Sie ExecuteReader() aufrufen. Wenn Sie dann versuchen, Render() in der Ansicht aufzurufen, wird nur eine leere Zeichenfolge zurückgegeben, da sie von der View Engine gerendert und freigegeben wurde. Wenn Sie einen Weg finden, bitte posten Sie es. – womp