Ich verwende Ajax.BeginForm, um ein Formular zu erstellen, das ein Ajax-Postback für eine bestimmte Controller-Aktion ausführt. Wenn die Aktion erfolgreich ist, sollte der Benutzer auf eine andere Seite umgeleitet werden (wenn die Aktion fehlschlägt, wird eine Statusmeldung mit angezeigt die AjaxOptions UpdateTargetId).
using (Ajax.BeginForm("Delete", null,
new { userId = Model.UserId },
new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
new { name = "DeleteForm", id = "DeleteForm" }))
{
[HTML DELETE BUTTON]
}
Wenn das Löschen erfolgreich ist, gebe ich ein Umleitungsergebnis zurück:
[Authorize]
public ActionResult Delete(Int32 UserId)
{
UserRepository.DeleteUser(UserId);
return Redirect(Url.Action("Index", "Home"));
}
Die Home Controller-Indexansicht wird jedoch in die UpdateTargetId geladen, sodass ich eine Seite innerhalb einer Seite habe. Zwei Dinge, über die ich nachdenke:
- Entweder entwerfe ich das falsch und sollte diese Art von Aktion anders behandeln (ohne Ajax).
- Anstatt ein Redirect-Ergebnis zurückzugeben, geben Sie eine Ansicht mit Javascript zurück, die die Umleitung auf der Clientseite ausführt.
Hat jemand Kommentare zu # 1? Oder wenn # 2 eine gute Lösung ist, wie würde die "Javascript-Ansicht umleiten" aussehen?
quelle
return JavaScript( "window.location = '" + Url.Action("Edit","Dispatch") + "'" );
Sie können einen JSON mit der URL zurückgeben und die window.location mithilfe von JavaScript auf der Clientseite ändern. Ich bevorzuge diesen Weg, als eine JavaScript-Funktion vom Server aufzurufen, was meiner Meinung nach die Trennung von Bedenken aufhebt.
Serverseite:
Client-Seite:
Natürlich können Sie weitere Logik hinzufügen, da auf der Serverseite ein Fehler auftreten kann. In diesem Fall kann die Eigenschaft result auf diese Situation hinweisen und die Umleitung vermeiden.
quelle
Das Verhalten, das Sie erzeugen möchten, lässt sich mit AJAX nicht am besten ausführen. AJAX wird am besten verwendet, wenn Sie nur einen Teil der Seite aktualisieren und nicht vollständig auf eine andere Seite umleiten möchten. Das macht den ganzen Zweck von AJAX wirklich zunichte.
Ich würde vorschlagen, AJAX nicht mit dem von Ihnen beschriebenen Verhalten zu verwenden.
Alternativ können Sie versuchen, jquery Ajax zu verwenden, das die Anforderung sendet, und dann einen Rückruf angeben, wenn die Anforderung abgeschlossen ist. Im Rückruf können Sie feststellen, ob dies fehlgeschlagen oder erfolgreich war, und bei Erfolg auf eine andere Seite umleiten. Ich habe festgestellt, dass jquery Ajax viel einfacher zu verwenden ist, zumal ich die Bibliothek ohnehin schon für andere Zwecke verwende.
Eine Dokumentation zu jquery ajax finden Sie hier . Die Syntax lautet jedoch wie folgt:
quelle
Obwohl nicht elegant, funktioniert es in bestimmten Situationen für mich.
Regler
Modell
/Views/Shared/JavascriptRedirect.cshtml
quelle
Die Verwendung
JavaScript
wird definitiv den Job machen.Sie können auch verwenden,
Content
wenn dies mehr Ihr Stil ist.Beispiel:
MVC-Controller
Javascript
quelle
Sie können einfach wie folgt in Ajax Success schreiben:
quelle
Wie wäre es damit :
Und dann
Oder
quelle
Ich musste dies tun, weil ich ein Ajax-Anmeldeformular habe. Wenn sich Benutzer erfolgreich anmelden, leite ich auf eine neue Seite um und beende die vorherige Anforderung, da auf der anderen Seite die Weiterleitung an die vertrauende Partei erfolgt (da es sich um ein STS-SSO-System handelt).
Ich wollte jedoch auch, dass es mit deaktiviertem Javascript funktioniert, da es der zentrale Login-Hop ist und so weiter.
quelle
Sie können einfach eine Art Ajax-Antwortfilter für eingehende Antworten mit $ .ajaxSetup ausführen . Wenn die Antwort eine MVC-Umleitung enthält, können Sie diesen Ausdruck auf der JS-Seite auswerten. Beispielcode für JS unten:
Wenn die Daten lauten : "window.location = '/ Acount / Login'" über dem Filter, wird dies abgefangen und ausgewertet, um die Umleitung vorzunehmen.
quelle
Ich bin nicht zufrieden mit der besten Antwort von Joseph, anstatt das richtige Problem zu beheben, sagte er, dass dies ein falscher Anwendungsfall ist. In der Tat gibt es viele Orte, zum Beispiel, wenn Sie eine alte Codebasis in ajaxifizierten Code konvertieren und dort brauchen Sie es, dann brauchen Sie es. Bei der Programmierung gibt es keine Entschuldigung, denn nicht nur Sie programmieren die schlechten und guten Entwickler und Sie müssen Seite an Seite arbeiten. Wenn ich die Umleitung in Ajax nicht codiere, kann mein Entwickler mich zwingen, eine Lösung dafür zu finden. Genauso wie ich alle AMD-gemusterten Sites oder mvc4 verwenden möchte und meine Firma mich ein Jahr lang davon fernhalten kann.
Sprechen wir jetzt über die Lösung.
Ich habe verdammt viel Ajax-Anfragen und -Antworten bearbeitet und der einfachste Weg, den ich herausgefunden habe, war, Statuscodes an den Client zu senden und eine Standard-Javascript-Funktion zu haben, um diese Codes zu verstehen. Wenn ich zum Beispiel einfach Code 13 sende, könnte dies eine Weiterleitung bedeuten.
Für eine JSON-Antwort wie {statusCode: 13, messsage: '/ home / logged-in'} werden natürlich unzählige Variationen vorgeschlagen, wie {status: 'success', code: 13, url: '/ home / logged-in ', Nachricht:' Sie sind jetzt angemeldet '}
usw., also bis zu Ihrer eigenen Auswahl an Standardnachrichten
Normalerweise erbe ich von der Basis-Controller-Klasse und stelle meine Auswahl an Standardantworten wie folgt ein
Über die Verwendung von $ .ajax anstelle von Ajax.BeginForm Ich würde gerne Jquery Ajax verwenden, aber ich bin es nicht auf der ganzen Welt, um Entscheidungen zu treffen. Ich habe eine Anwendung voller Ajax.BeginForm und natürlich habe ich das nicht getan. Aber ich muss damit leben.
Es gibt also auch einen erfolgreichen Rückruf in der Startform. Sie müssen jquery ajax nicht verwenden, um Rückrufe zu verwenden. Ajax.BeginForm, Calls Action, Rückgabe von JSON, Wie greife ich in meiner OnSuccess JS-Funktion auf das JSON-Objekt zu?
Vielen Dank
quelle
Wenn Sie von der JavaScript-Klasse umleiten
gleiche Ansicht - unterschiedliche Steuerung
ist nicht die gleiche Ansicht
quelle
Fügen Sie eine Hilfsklasse hinzu:
Rufen Sie dann Ihre Aktion auf:
this.RedirectTo ("Index", "Zement");
Fügen Sie Javascript-Code zu jeder globalen Javascript-Datei oder Layout-Datei hinzu, um alle Ajax-Anforderungen abzufangen:
quelle
Wie Ben Foster sagt, können Sie die Javascripts zurückgeben und es wird Sie zur gewünschten Seite weiterleiten.
So laden Sie eine Seite auf der aktuellen Seite:
So laden Sie die Seite auf der neuen Registerkarte:
quelle
Sie können eine nicht auf js basierende Umleitung von einem Ajax-Aufruf erhalten, indem Sie eines dieser Meta-Refresh-Tags eingeben. Das hier scheint zu funktionieren:
return Content("<meta http-equiv=\"refresh\" content=\"0;URL='" + @Url.Action("Index", "Home") + "'\" />");
Hinweis: Ich habe festgestellt, dass Meta-Aktualisierungen von Firefox automatisch deaktiviert werden, was dies nicht sehr nützlich macht.
quelle