2010-12-10 41 views
4

Je viens de rencontrer un problème étrange. Je l'ai réparé, mais j'espère que vous pourrez m'aider à mieux comprendre ce qui s'est vraiment mal passé. Je vais commencer par une explication de ce qui s'est passé. Le problème concerne une application MVC3 RC1 simple.Problème avec l'appel à l'action Html.Action avec l'attribut [HttpGet]

Dans ma page principale de l'application il y a un appel à une action sur un contrôleur pour rendre une connexion forme:

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

La méthode d'action sur la classe AccountController retourne un PartialViewResult contenant le login forme.

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

Aujourd'hui, je fait un changement à cette méthode d'action et attribué avec le HttpGetAttribute comme ceci:

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

C'est ce qui a causé des problèmes. Cependant, les problèmes n'existaient que dans un scénario particulier - et c'est ce qui me déroute. Lorsque affichant un formulaire à un contrôleur tout fonctionnerait très bien à condition que l'action du contrôleur a ensuite retourné un RedirectToRouteResult. Si l'action vient de renvoyer un ViewResult (à sa vue par défaut), ma gestion des erreurs Http404 se déclencherait et bouclerait pour toujours.

J'ai mis en œuvre la gestion des erreurs 404 d'une manière très similaire à ce qui est décrit dans la troisième réponse à cette question: Requirements for 404. Si vous ne voulez pas lire ce post, en termes simples, je remplace la méthode HandleUnknownAction sur ma classe de contrôleur de base et instancie une instance de ma classe ErrorController dans cette méthode et appelle Execute, en lui passant une instance de RouteData: Tout le ErrorController fait est enregistrer l'erreur et retourner une vue avec un message d'erreur amical. Eh bien, c'est comme ça que devrait fonctionner. Mais dans ce cas, la gestion des erreurs entrerait dans une boucle infinie où le AccountController (auquel mon formulaire a été posté) invoquerait HandleUnknownAction encore et encore et encore.

Il n'y avait rien dans les journaux d'erreurs pour indiquer ce qui s'était mal passé (je pense que je connecte à peu près tout) - ce qui était également étrange. J'ai donc pensé que si je retirais la méthode HandleUnknownAction de la classe de base de mon contrôleur, peut-être que quelque chose d'autre serait révélé. Et ce fut:

2010-12-10 19: 11: 47956 [4] ERREUR Infrastructure.Log4NetAuditor [System.Web.HttpException (0x80004005): Erreur d'exécuter la demande de l'enfant pour gestionnaire « System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '. ---> System.Web.HttpException (0x80004005): L'exécution de la demande de l'enfant a échoué. Veuillez examiner la InnerException pour plus d'informations. ---> System.Web.HttpException (0x80004005): Une méthode d'action publique 'LoginForm' n'a pas été trouvée sur le contrôleur 'Cdo.Web.Controllers.AccountController'.

Qu'est-ce que le? Quand j'ai vu cela, je me suis souvenu que je mettrais le HttpGetAttribute sur cette méthode - donc je l'ai rapidement enlevé ... et l'ordre a été restauré. Je suis heureux d'avoir découvert ce que causé cela - mais je reste dans l'obscurité sur pourquoi il est arrivé. Si vous êtes en mesure de m'aider à faire la lumière sur ce sujet, je serais très obligé. Pourquoi le HttpGetAttribute ferait-il une différence ici?

+1

il est difficile de suivre le cas ci-dessus. «Cependant, les problèmes n'existaient que dans un scénario particulier - et c'est ce qui me dérange: lorsque vous envoyez un formulaire à un contrôleur, tout fonctionne correctement, à condition que l'action du contrôleur renvoie un RedirectToRouteResult. sa vue par défaut), ma gestion des erreurs Http404 serait en boucle et boucle pour toujours. " quelle action. "un formulaire" est référencé. Quelle forme? lors de l'affichage de quelle méthode de contrôleur? essayez-vous de poster à la même méthode? La vue LoginForm redépose à quelle action? Y at-il un problème ici? –

Répondre

0

Essayez de définir l'attribut outputcache sur action. Je me souviens de ce genre de problème et c'était une solution. définir la durée sur 1