2009-07-08 14 views
12

Ich habe eine Ansicht, die aus oberen, linken und unteren Kopfzeilen und einem Hauptinhaltsbereich besteht. Angenommen, während einer AJAX-Anfrage muss ich den HTML-Code des oberen, unteren und Hauptfensters aktualisieren (der linke Header sollte gleich bleiben).ASP.NET MVC und AJAX

Ich fragte mich, was wäre der beste Weg, dies zu erreichen. Der erste Gedanke war, die Hauptinhaltsanzeige in eine Partialansicht zu stellen und eine Controlleraktion auszuführen, die PartialView zurückgibt. Dies würde nicht funktionieren, da die Aktion nur den HTML-Code des Hauptbereichs zurückgibt, kann ich die oberen und unteren Header nicht aktualisieren.

Also wenn ich die oberen und unteren Header in ihre eigenen jeweiligen Teilansichten setzen würde ich meine Controller-Aktion, um mehrere Teilansichten zurückzukehren. Ist das überhaupt möglich oder mache ich etwas völlig daneben?

Ich sah, dass es möglich ist, render a partial view to a string, so dass ich dachte, dass ich diese Technik in der Aktion verwenden konnte, um ein JSON-Objekt mit 3 Eigenschaften, die HTML der 3 Teiltafeln, die ich aktualisieren muss. Aber das fühlt sich, wenn überhaupt möglich, sehr falsch an.

Eine andere Idee, die ich hatte, war, ein JSON-Objekt zurückzugeben, das nur die Daten enthält, die für die Partials notwendig sind, und Javascript zu verwenden, um das HTML zu konstruieren. Aber das Erstellen einer Benutzeroberfläche in Javascript sieht wie ein schwieriger Job aus (Der Hauptinhalt verwendet MvcContribs GridView mit Blättern und Sortieren).

Also würde ich wirklich Vorschläge zu schätzen, was wäre der sauberste Ansatz, um ein solches Szenario zu behandeln. Auch eine adaptive Lösung wäre großartig: Wenn der Benutzer beispielsweise Javascript deaktiviert hat, würde er einfach die ganze Seite ohne AJAX neu laden.


UPDATE:

Andrew Siemersuggested jeden Abschnitt in seine eigene Teilansicht platzieren und mehr ajax Anfragen auszuführen. Dies scheint ein vollkommen gültiger Ansatz zu sein, aber leider ist er in meinem Szenario nicht anwendbar, weil ich in meiner ursprünglichen Problembeschreibung folgende Details übersehen habe: Der obere Header wird tatsächlich verwendet, um Fehler-/Informationsmeldungen von Ereignissen im Hauptfenster anzuzeigen. Zum Beispiel muss ich die Fehlermeldung anzeigen, falls beim Abrufen des Modells für das Hauptfenster eine Ausnahme ausgelöst wird. Daher konnte nur eine einzige Anfrage gestellt werden, um diese beiden Panels zu aktualisieren.

+0

könnten Sie einen Blick auf dieses: http://stackoverflow.com/questions/7086440/mvc-validating-binded- to-entity-with-reference-to-other-entities pls (habe keine Ahnung, wie Sie direkt kontaktieren können) :) thnx – cpoDesign

Antwort

9

Sie können jeden Abschnitt problemlos in eine eigene Teilansicht einfügen. Dies würde Ihnen dann erlauben, eine jquery Anfrage für jede Ansicht zu machen, sobald Ihre Daten gesendet/geändert wurden. Jeder Anruf könnte dann in den entsprechenden Abschnitt geschoben werden. Dies ist sehr machbar und klingt wie der richtige Weg.

Ich würde nicht erwarten, dass Ihr Controller mehrere Teilansichten zurückgibt ... da dies SRP bricht!

Update: Im folgenden mit Ihrem Update ... können Sie die Abschnitte noch separat abrufen. Dies erfordert einfach etwas mehr Ajax-Coolness, da jeder Abruf einen Fehlerbrocken zurückgeben kann (über eine JSON-Anfrage). Wenn ein Fehler zurückkommt, können diese Fehlermeldungen in der Kopfzeile angezeigt werden. Oder ... Sie können die Header-Anforderung auf Fehler setzen, sobald alle anderen Anfragen zurück gemeldet wurden. In diesem Fall kann jede Teilansicht ihre Fehlermeldungen an eine Sitzungsvariable für den Fehlerstatus übergeben ... und dann diese Nachrichten anzeigen die Überschrift.

Ein großer Grund für die Entscheidung, mit jedem Abschnitt zu gehen, da es sich um einen eigenen Abschnitt und nicht um einen übergeordneten Antrag handelt, ist im ursprünglichen Entwurf möglicherweise noch nicht ersichtlich.Wenn jeder Abschnitt separat gesteuert wird, können Sie dann phantastische Dinge tun, wie z. B. das unabhängige Zwischenspeichern jedes Abschnitts, das Bereitstellen häufigerer Aktualisierungen in einem Bereich usw.

+0

Danke für den Tipp Andrew. Leider habe ich ein wichtiges Detail in meiner ursprünglichen Beschreibung verpasst, so dass ich fürchte, dass dieser Vorschlag in meinem Szenario nicht angewendet werden kann. Ich habe meine Frage entsprechend aktualisiert. –

0

Dies ist ein heikles Thema. Wie wäre es damit?

Richten Sie für jede Komponente oben, links, Haupt eine partial request ein, die jeweils eine Teilansicht mit den für diesen Bereich erforderlichen Daten zurückgibt. Dann jedes Mal, wenn ein Ereignis im Hauptbereich ist, eine Aktualisierung der Teiltöne in jedem Bereich starten, um sie zu aktualisieren.

Alternativ können Sie alle auf festen Timern für neue Daten abfragen.

0

Wie wäre es, wenn Sie Ihre obere und rechte Ansicht in versteckte divs in Ihrer Hauptansicht einbeziehen und sie unter Last an die richtigen Stellen verschieben würden?

0

Ich weiß, diese Frage beantwortet wurde, aber dachte, ich würde nur Pech in einem Vorschlag:

  • Backbone.js und jQuery Templating Ihre Probleme leicht lösen würde.

(nur gonna lassen diese hier als Vorschlag für die Menschen diese Frage zu lesen)