2010-01-13 8 views
21

Ich habe einige Teilaktionen, die ich mit der Asp.Net Futures RenderAction-Methode rendern. Einige davon führen Weiterleitungen durch, nachdem die Formulare in ihnen verarbeitet wurden.Warum sind Redirect Ergebnisse nicht in Child Aktionen in Asp.net MVC 2

Jetzt, dass ich auf Asp.Net MVC 2 RC aktualisiert, gibt es mir einen Fehler "Untergeordnete Aktionen sind nicht berechtigt, Redirect-Aktionen durchzuführen".

Ich überprüfte den Quellcode und ich fand die Zeile, die die Ausnahme auslöst. Um es zu umgehen, kann ich ein eigenes RedirectResult machen, aber bevor ich das tue, möchte ich verstehen, warum das Framework es überhaupt nicht erlaubt. Es muss einen guten Grund geben und vielleicht sollte ich auch nicht.

Kennt jemand den Grund für diese Einschränkung?

Dank

Antwort

32

Die Einschränkung besteht, da MVC hat bereits Rendering einen Blick auf den Client gestartet. Die Umleitung von diesem Punkt aus ist nicht definiert. Es könnte perfekt funktionieren, es könnte weiterhin die ursprüngliche Ansicht ohne Umleitung rendern, es könnte eine andere Ausnahme usw. auslösen.

Da das Ergebnis der Ausführung dieser Aktion undefiniert ist, blockiert das Framework es. In der Praxis sollte RenderAction aus ähnlichen Gründen niemals dazu verwendet werden, etwas anderes als eine Ansicht (oder ansichtsähnlichen Inhalt) zu rendern.

In Ihrem speziellen Fall sollte die äußere Aktion umleiten. Wenn Sie nur noch aus der Ansicht heraus weiterleiten, ohne dem Benutzer etwas zu zeigen, dann war es wirklich sinnlos, die Ansicht von vorneherein durchzugehen, da die äußere Aktion die Arbeit auf ihre Weise delegiert haben könnte besitzen.

1

In diesem Fall zeigen Sie einfach die Submit-URL der Teilansichtsform an die Aktion, die das Ziel Ihrer problematischen Umleitung war, und lassen Sie sie sich selbst auf ihre GET-Version umleiten.

6

In meinem Fall ist das Formular, das gerendert wird, ein "configure" Panel auf einer Erweiterung zu einer Website, die ich baue. Ich möchte, dass der eigene Controller der Erweiterung in der Lage ist, die Formularverarbeitung zu verarbeiten und dann zurück zur Admin-Seite umleite, die alle konfigurierten Erweiterungen auflistet. Ich denke nicht, dass es angemessen oder praktisch ist, den Controller der übergeordneten Seite zu bitten, das Formular für die Erweiterung zu verarbeiten. Was würdest du vorschlagen, stattdessen?

+0

Das ist das gleiche Szenario, das ich habe. Da ich es nur für Erweiterbarkeit auf Admin-Seiten verwende, habe ich beschlossen, die Weiterleitung im Kind-Action-Controller zu behalten. Ich schrieb mein eigenes ChildActionRedirectResult und machte dann eine ChildActionController-Basis, die die Redirect-Methoden überschreibt, um mein eigenes Ergebnis zu verwenden. Ich würde dies nicht für den Front-End-Einsatz tun. – Sruly

+0

Ich habe am Ende nur ein einfaches Suchergebnis mit einer Meldung "Ihre Änderungen wurden gespeichert" und einen Link zurück zur Verwaltungsseite für die Verwaltung von Erweiterungen zurückgegeben. Es ist nicht so schön, aber es hat den Trick gemacht. –

3

Manchmal trat dieser Fehler auf, wenn Sie versuchen, eine Aktion des Basisaktionsergebnis zu rendern. Beispiel:

ActionResult X 
    Return View 
View X 
    RenderAction Y 

ActionResult Y 
    // Bla bla 
     return View 
    // else 
     return RedirectToAction X 
12

Meine Lösung.

Aktionsmethode:

return View("Redirect", model); 

Ausblick:

<script type="text/javascript" language="javascript"> 
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script> 
17

Probieren Sie etwas wie dies in den Kindern Aktion zu verwenden:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 
+1

Ich habe dies in einer Login-Aktion als Teilansicht der Hauptseite angezeigt, die bei erfolgreicher Anmeldung umleiten muss – user1760527

+0

Dies bewirkt, dass der Client-Browser erneut die Seite nach Erhalt der Redirect-Header anfordern, aber es funktioniert gut genug. –

5

In meinem ungewöhnlichen Fall hatte ich eine benutzerdefinierte AuthorizeAttribute an meine Controller angehängt, die versucht haben, auf eine Kinderaktion umzuleiten, die (wie oben erwähnt) nicht allo ist heiraten.

das Problem zu beheben, entfernte ich Berechtigungs Umleitung für alle untergeordneten Aktionen Überprüfung:

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    //Child actions cannot redirect anyway, so no need to check permissions. 
    If filterContext.IsChildAction Then Exit Sub 

    .. parent authorisation checks ..