ASP.Net MVC-Teilansichten, die ihren Modellstatus beibehalten?

9

Das ist wahrscheinlich wieder eine neue Frage.

Wenn ich eine ASP.NET MVC2-Anwendung erstelle, wird ein Account Controller mit einem Action LogIn wie folgt erstellt:

%Vor%

Ich möchte jetzt keine Login-Seite haben, ich möchte Login-Steuerelemente als Teil einer größeren Seite haben. Also habe ich Login.aspx zu Login.ascx geändert und ich integriere es in meine Hauptansicht entweder mit Html.RenderPartial oder Html.RenderAction.

Beide funktionieren wie ein Zauber, wenn der Login erfolgreich ist. Wenn nicht, dann

%Vor%

bringt mich um. Was ich will, ist, zu meiner Hauptseite zurückzukehren (Home / Index), aber mit den Fehlerinformationen der Teilansicht.

%Vor%

Offensichtlich funktioniert das nicht.

Hinweise?

    
Sparhawk 20.06.2010, 21:20
quelle

5 Antworten

3

Das ist sicher keine neue Frage und ich habe das Internet nach einer Antwort auf dieses Problem durchkämmt und bis jetzt war die beste Lösung, die ich gefunden habe, irgendwie in diesem Tutorial versteckt. hier . Das hat Darin Dimitrov mit der Aktualisierung von Ajax vorgeschlagen. Ich fasse die wichtigen Teile dieses Links zusammen und warum dies nicht einfach zu beheben ist: /

Ajax-Aktualisierung basierend auf einem seltsamen Liebhaber

Die Lösung mit der Ajax-Aktualisierung hängt ziemlich stark von der folgenden Funktion ab (seltsamer Liebhaber benutzt ControllerContext, aber er existierte nicht für mich, deshalb habe ich ControllerExtension):

%Vor%

Diese Funktion übernimmt Ihr Modell + Modellstatus und gibt Ihre Teilansicht in eine HTML-Zeichenfolge um. Sie können dann diese Zeichenfolge aufnehmen und sie in einem json-Objekt an ein JavaScript zurücksenden, um die Ansicht zu aktualisieren. Ich habe jquery benutzt und es sieht so aus,

%Vor%

Jquery Erklärung:

  1. Sieh dir das div an, das meine partielle (class="partielle") enthält, und finde die Form innerhalb dieses div
  2. Binden Sie alle anderen "submit" -Ereignisse mit diesem Formular ab (ich habe einen seltsamen doppelten Fehler bekommen, bis ich das gelöst habe).
  3. benutze "live", so dass der Inhalt nach dem Ersetzen erneut gebunden wird
  4. Sobald wir die Funktion partialViewUpdate ...
  5. eingeben
  6. Verhindern Sie, dass das Formular den Übermittlungsvorgang beendet, so dass alles von ajax verarbeitet werden kann.
  7. hole das div, das meinen Teil enthält (wird das später verwenden)
  8. Richten Sie die jquery post-URL ein, indem Sie sie aus dem Formular $ (this) .attr ("action")
  9. übernehmen
  10. Nimm das Formular (d. h. unser Modell) und serialisiere es für die Controller-Funktion $ (this) .serialize ()
  11. Erstellen Sie die Funktion, die den Ajax-Rückgabewert behandelt.
  12. Ich benutze mein persönliches json-Objekt, wo ein StatusCode 1 schlecht ist. Also, wenn es schlecht ist, dann nehme ich, was in Inhalt ist, das ist die Zeichenfolge, die RenderPartialViewToString mir gegeben hat, und ich ersetze nur den Inhalt des div, das meine partielle enthält.

Warum funktioniert das nicht normal?

Der Grund dafür, dass die Partialtypen nicht nur mit der Validierung des Modellstatus arbeiten, ist, dass Sie View (Modell) nicht mit dem POST zurückgeben können, weil MVC dies stattdessen an die Routenadresse der Teilansicht (login.ascx) auflöst wo der Teil eingebettet ist (index.aspx).

Sie können RedirectAction () auch nicht verwenden, da dies an die (index.aspx) Controller-Funktion gesendet wird, was dem Löschen und Aktualisieren der index.aspx-Seite entspricht. Wenn Sie jedoch den ActionFilter verwenden, der von Chino und Thabaza vorgeschlagen wurde, wird die Seite, wenn Ihre Seite aktualisiert und die login.ascx-Controller-Funktion erneut ausgelöst wird, diese Tempdata übernehmen. Dies funktioniert jedoch nicht, wenn das Aktualisieren der Seite Probleme mit clientseitigem Code wie Popupmodellen verursacht (d. H., Wenn Sie das Popup aktualisieren, ist es weg).

Sagen Sie es nicht so

Ich würde es vorziehen, wenn es "nur funktioniert", also wenn jemand den richtigen / besseren Weg kennt, diese Bitte zu teilen, teilen Sie es! Ich habe immer noch das Gefühl, dass die Ajax Refresh- und ActionFilter-Lösungen keine saubere Methode sind, da es fast so aussieht, als ob Teilansichten mit Formularen ohne einen "Trick" nicht möglich wären.

    
Thirlan 11.02.2011, 18:14
quelle
1

Yeah redirecttoaction, aber gib eine Fehlermeldung in den tempdata an, also solltest du so etwas machen

%Vor%

Natürlich sollten Sie im Hauptindex ein div haben, das die Nachricht

anzeigt %Vor%

BEARBEITEN Ich sehe, dass Sie den Modellstatus beibehalten möchten, der ein Problem sein könnte, aber Sie könnten den Modellstatus in der Indexaktion übergeben oder das Modellstatusobjekt in den Tempdata übergeben. Was Sie dann tun können, ist zu überprüfen, ob es im Objekt ein modelstate Fehler gibt und wenn es das Feld überprüft und den Fehler zum rechten Feld hinzufügt.

    
Chino 20.06.2010 21:27
quelle
0

Sie können die anzuzeigende Ansicht explizit angeben:

%Vor%

Auf diese Weise werden Fehlerinformationen beibehalten und die korrekte Ansicht gerendert.

    
Darin Dimitrov 20.06.2010 21:30
quelle
0

Sehen Sie sich Praxis # 13 in diesem Blog . Diese Methode funktioniert gut, um Modellstatusinformationen zu übergeben, wenn Sie im PRG-Stil (Post-Redirect-Get) codieren. Sie müssen nur ein paar Aktionsfilter erstellen und diese entsprechend Ihren Aktionen zum Abrufen und Buchen anwenden.

    
Tahbaza 22.06.2010 03:50
quelle
0

Ich hatte das gleiche Problem, wenn ich Ajax.BeginForm benutzte, wo ich eine Teilansicht zurückgeben musste, aber alle modelstate Fehler waren weg. Was ist der Trick, den Ajax.BeginForm-Teil in eine separate Ansicht zu isolieren, und RenderPartial diese Ansicht innerhalb des UpdateTargetId-DIV in einer anderen, die Ansicht enthält.

Auf diese Weise können Sie das Ansichtsmodell mit den Modellfehlern zurückgeben, wenn Sie sie haben, oder nur eine Erfolgsmeldung Ihrer Wahl (falls vorhanden) anzeigen. Hier ist eine großartige, detaillierte Erklärung: Ссылка

    
Eitan Rousso 05.07.2011 22:13
quelle

Tags und Links