RedirectToRoute verursacht eine Umleitungsschleife

8
%Vor%

Ich erwarte, dass diese Aktion den Benutzer auf die Startseite umleitet, aber statt dessen findet eine Umleitungsschleife (laut Chrome) statt.

Die oben erwähnte Aktion gehört zu einem Controller im Bereich "admin", wo die "Home" Route für den Standardbereich definiert ist - ich vermute, dass dies relevant ist.

Hier ist die Route für ein gutes Maß:

%Vor%

Aktualisieren

Wenn Sie die return -Anweisung durch die folgende ersetzen, wird die Aktion wie erwartet funktionieren:

%Vor%

Ich möchte wissen, warum das so ist. Idealerweise kann ich das (umständliche) zweite Argument weglassen.

    
Caster Troy 25.07.2014, 05:46
quelle

3 Antworten

4

Dieses Problem betrifft insbesondere den Aufruf RedirectToRoute(string) und Ihre spezielle Route:

%Vor%

Was Sie erwartet haben war, dass RedirectToRoute Ihre willkürliche Routendefinition von {controller}/{action}/ mit den definierten Standardwerten der Route füllen würde:

%Vor%

Aber RedirectToRoute ist wie alle Redirect-Methoden ein Teil Ihres Controllers und verwendet Ihren aktuellen Controller und Action als Standardwerte, wo immer es möglich ist. Dies ist ein "Feature" des ASP.NET MVC Frameworks - die Wiederverwendung von Routen zum Erstellen neuer Routen. Dieser Ansatz ist wertvoll, da Ihr aktueller Controller und Ihre Aktion starke Hinweise auf Ihre Absicht geben.

Ein gutes Beispiel hierfür ist RedirectToAction(string) , das davon ausgeht, dass Ihr momentan instanziierter Controller der Standard ist.

Vergleichen Sie dies mit:

%Vor%

Anstatt das Framework anzuleiten, dass es am besten rät, wie die mehrdeutige Wildcard-Route aufgefüllt werden soll, haben Sie das Framework angewiesen, die Defaults von RouteTable für die Route "Home", um eine Route zu erstellen und als RouteObject zurückzugeben.

    
Dave Alperovich 27.07.2014, 20:19
quelle
3

Wenn Sie RedirectToRoute (string)

  

Diese Methode konvertiert den Routennamen, der in routeName an eine URL übergeben wird, mithilfe der Methode RouteCollection.GetVirtualPath .

Dabei übergeben Sie null als Parameter RouteValueDictionary . Also in diesem Fall wurde diese Parameter von aktuellen RequestContext mit Werten für Controller, Aktion und usw., d. H. Sie erhalten URL wie folgt

%Vor%

und habe Umleitungsschleife.

wenn Sie

anrufen %Vor%

stattdessen RedirectToRoute (string) verwendet RedirectToRoute(String, RouteValueDictionary) und in RouteCollection.GetVirtualPath Methode übergeben Sie die Standardwerte für diese Route.

    
Grundy 27.07.2014 18:33
quelle
2

Es ist eine allgemeine Best Practice in MVC, Ihren Controllern so viel Kontrolle wie möglich zu ermöglichen. Es gibt mehrere Controller-Methoden, die Sie verwenden können, und Sie sollten in der Regel diejenige verwenden, die am besten zu dem Prozess passt, den Sie ausführen.

  • return View() . weist den Controller an, den angegebenen HTML-Code zu generieren und zurückzugeben, ähnlich einem Server.Transfer() . Verwenden Sie diese Option, um HTML mit Aktionen abzugleichen oder statisches HTML ohne Interesse an der URL-Zeichenfolge bereitzustellen.

  • Return RedirectToAction() . Weist den Controller an, basierend auf der Aktion eine neue URL-Zeichenfolge zu erstellen. Dadurch wird das Routenwörterbuch für die Aktion analysiert und die Standardwerte werden verarbeitet. Es fungiert als Response.Redirect() und gibt eine neu generierte URL zurück. Im Allgemeinen ist dies die am häufigsten verwendete Umleitung. Dies hat auch den Vorteil, dass das Routenwörterbuch nicht geändert wird.

  • return RedirectToRoute() . Ähnlich wie RedirectToAction() , jedoch an das Route Dictionary gebunden. Dies wird das Route Dictionary nach einer genauen Routenübereinstimmung durchsuchen, unter Verwendung welcher Route auch immer Parameter übergeben werden. Dies sucht nicht nach Aktionen und erstellt daher keine Route oder injiziert Standardwerte. Wird verwendet, wenn eine genaue Route mit bestimmten nicht standardmäßigen Werten verarbeitet werden muss.

  • return Redirect() . Diese Weiterleitung erfordert eine vollständige URL und wird auf die neue URL umgeleitet. Wird normalerweise verwendet, wenn auf eine URL in einer völlig anderen Domäne umgeleitet wird.

Claies 27.07.2014 19:31
quelle