2010-12-10 6 views
4

Ich habe gerade ein seltsames Problem festgestellt. Ich habe es behoben, aber ich hoffe, dass Sie mir helfen können, besser zu verstehen, was eigentlich schief gelaufen ist. Ich beginne mit einer Erklärung, was passiert ist. Das Problem betrifft eine einfache MVC3 RC1 App.Problem mit Html.Action Call to Action mit [HttpGet] Attribut

In meinem App-Masterseite gibt es einen Aufruf zu einer Aktion auf einem Controller ein Login-Formular zu machen:

@Html.Action("LoginForm", "Account") 

Die Aktionsmethode auf der Account-Klasse gibt eine PartialViewResult das Login-Formular enthält.

public PartialViewResult LoginForm() 
{ 
    return PartialView(); 
} 

Heute habe ich eine Änderung an dieser Aktion Methode und schrieb es mit dem HttpGetAttribute etwa so:

[HttpGet] 
public PartialViewResult LoginForm() 
{ 
    return PartialView(); 
} 

Dies ist, was Probleme verursacht. Die Probleme existierten jedoch nur in einem bestimmten Szenario - und das ist es, was mich verblüfft. Wenn Posting ein Formular an einen Controller würde alles gut funktionieren vorausgesetzt, dass die Controller-Aktion dann eine RedirectToRouteResult zurückgegeben. Wenn die Aktion gerade ein ViewResult (in der Standardansicht) zurückgegeben hat, würde meine Http404-Fehlerbehandlung für immer in den Anfang treten.

Ich habe die 404-Fehlerbehandlung in einer Weise implementiert, die der in der dritten Antwort auf diese Frage beschriebenen ähnelt: Requirements for 404. Wenn Sie diesen Beitrag nicht lesen möchten, überschreibe ich einfach die HandleUnknownAction-Methode für meine Basis-Controller-Klasse. In dieser Methode instanziiere ich eine Instanz meiner ErrorController-Klasse und rufe Execute auf und übergebe ihr eine Instanz von RouteData:

protected override void HandleUnknownAction(string actionName) 
{ 
    // If controller is ErrorController dont 'nest' exceptions 
    if (this.GetType() != typeof(ErrorController)) 
     this.InvokeHttp404(HttpContext); 
} 

public ActionResult InvokeHttp404(HttpContextBase httpContext) 
{ 
    IController errorController = DependencyResolver.Current.GetService<ErrorController>(); 

    var errorRoute = new RouteData(); 
    errorRoute.Values.Add("controller", "Error"); 
    errorRoute.Values.Add("action", "Http404"); 
    errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString); 
    errorController.Execute(new RequestContext(httpContext, errorRoute)); 

    return new EmptyResult(); 
} 

Alle Errorcontroller tun, ist das Fehlerprotokoll und eine Ansicht mit einer freundlichen Fehlermeldung zurück. Nun, so sollte es funktionieren. Aber in diesem Fall würde die Fehlerbehandlung in eine Endlosschleife eintreten, in der der AccountController (zu dem mein Formular gepostet wurde) die HandleUnknownAction immer und immer wieder aufrufen würde.

Es war nichts in den Fehlerprotokollen zu zeigen, was schiefgelaufen war (ich glaube, ich log nur über alles) - was auch seltsam war. Also dachte ich mir, wenn die HandleUnknownAction-Methode aus meiner Controller-Basisklasse entfernt würde, würde sich vielleicht etwas anderes ergeben. Und es war:

2010-12-10 19: 11: 47.956 [4] ERROR Infrastructure.Log4NetAuditor [System.Web.HttpException (0x80004005): Fehler Kind Anfrage Ausführung für Handler ‚System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '. ---> System.Web.HttpException (0x80004005): Die Ausführung der untergeordneten Anforderung ist fehlgeschlagen. Bitte prüfen Sie die InnerException für weitere Informationen. ---> System.Web.HttpException (0x80004005): Eine öffentliche Aktionsmethode 'LoginForm' wurde auf dem Controller 'Cdo.Web.Controllers.AccountController' nicht gefunden.

Was zum? Als ich das sah, erinnerte ich mich, dass ich das HttpGetAttribute auf diese Methode gesetzt hatte - also entfernte ich es sofort ... und die Reihenfolge wurde wiederhergestellt. Ich bin froh, entdeckt zu haben was verursacht - aber ich bleibe im Dunkeln auf warum es passiert ist. Wenn Sie mir helfen können, etwas Licht in die Sache zu bringen, wäre ich Ihnen sehr verbunden. Warum sollte das HttpGetAttribute hier einen Unterschied machen?

+1

Es ist schwer, den Fall oben zu folgen. "Allerdings existierten die Probleme nur in einem bestimmten Szenario - und das ist es, was mich verblüfft. Wenn ich ein Formular an einen Controller schrieb, würde alles gut funktionieren, vorausgesetzt, die Controller-Aktion gab dann ein RedirectToRouteResult zurück. Wenn die Aktion gerade ein ViewResult (to Standard-Ansicht), würde meine Http404-Fehlerbehandlung für immer in Kraft treten. " welche Aktion. Auf "eine Form" wird verwiesen. Welches Formular? Wann posten was zu welcher Controller-Methode? Versuchen Sie, auf dieselbe Methode zu posten? Die LoginForm-Ansicht speichert die Aktion? Gibt es da ein Problem? –

Antwort

0

versuchen, das outputcache-Attribut auf action zu setzen. Ich erinnere mich an diese Art von Problem und das war eine Lösung. Dauer einstellen auf 1

Verwandte Themen