2009-01-02 7 views
31

Ceci est lié à ma question sur how to handle errors from jQuery AJAX calls. Plusieurs réponses suggèrent que j'utilise le rappel "error" pour afficher les erreurs d'un appel jQuery AJAX. Je me demandais comment faire cela en utilisant ASP.NET MVC. Existe-t-il un moyen pour mon action de contrôleur de renvoyer une erreur qui serait accessible à partir du rappel "erreur"? Le code côté client ressemblerait à quelque chose comme ceci:Comment déclencher le rappel "error" dans un appel jQuery AJAX en utilisant ASP.NET MVC?

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    }, 
    error: function(request,status,errorThrown) { 

    } 
}); 

Répondre

21

NOTE: Hé, cela a été affiché avant ASP.Net MVC 1.0, même frappé, et je l'ai même pas regardé le cadre depuis. Vous devriez probablement arrêter d'afficher ceci.


Faire quelque chose comme ceci:

Response.StatusCode = (int)HttpStatusCode.BadRequest; 
actionResult = this.Content("Error message here"); 

Le code d'état doit changer en fonction de la nature de l'erreur; généralement, 4xx pour les problèmes générés par l'utilisateur et 5xx pour les problèmes côté serveur.

+1

L'avez-vous essayé dans IE8? La propriété request.responseText contient null, il n'y a pas la chaîne 'Error message here' :( – stej

+0

Vous avez également des problèmes pour obtenir le "Message d'erreur ici" dans FF ... – rball

1

Je pense que l'événement est soulevée pour toute réponse qui a un code de réponse autre que 200. Je ne peux pas trouver la preuve dans la documentation bien.

Pour ce faire, à partir du code (fonctionne en Webforms):

throw new HttpException(500, "Error message"); 
+0

Comment envoyer un code de réponse autre que 200 d'une action de contrôleur bien? Supposons que mon action de contrôleur détermine que l'utilisateur n'a pas le droit d'accéder à la fonction et que je souhaite renvoyer un code de réponse autre que 200 afin que le rappel "erreur" soit atteint. Comment ferais-je cela? –

+0

Hmm, lançant une exception de l'action du contrôleur faire l'affaire? Cela devrait renvoyer un code de réponse 500 droit? –

+0

Édité la réponse pour fournir une manière possible de le faire –

1

Selon this la page, il vous suffit d'appliquer l'en-tête HTTP/1.0 500 Internal Server Error sur votre page ASP.net. La demande $.ajax interceptera cette erreur et exécutera la fonction de rappel error. =]

8

Si vous utilisez

[HandleError] 

jetant alors un HttpException va se faire prendre et acheminés vers votre page d'erreur personnalisée.

Une autre option consiste à utiliser

Response.StatusCode = 500; 
Response.Write("Error Message"); 
Response.End(); 

Il y a probablement un moyen plus pratique d'écrire cela, mais je n'ai pas trébuché sur encore.

+0

Ouais, l'attribut [HandleError] était ce qui m'avait amené. Il attrapait mes exceptions et redirigeait vers ma page d'erreur Malheureusement, cet attribut était sur la classe de contrôleur, donc je ne l'ai pas vu immédiatement –

+0

Je crois que vous avez marqué une réponse incorrecte, je préférerais la réponse d'ALassek à la HttpException qui est techniquement fausse –

+0

Techniquement mauvais si vous utilisez HandleError, techniquement –

7

Si vous utilisez MVC 3, alors vous pouvez retourner un ActionResult dans votre contrôleur qui a le code d'état HTTP et le message d'état ainsi:

return new HttpStatusCodeResult(500, "Error message"); 

Ensuite, dans votre rappel d'erreur:

error: function (request, textStatus, errorThrown) { 
    alert(request.statusText); 
} 
+0

Je me demande ce que le code est derrière nouveau HttpStatusCodeResult (500, "Message d'erreur "); est. Est-ce que la source est quelque part ou peut-être que nous pouvons réflectoriser? Probablement être utile pour ceux d'entre nous dans 2. – rball

+0

@rball - Le code est sur codeplex sur le lien suivant: http://aspnet.codeplex.com/releases/view/50092 – amurra

+0

Cela me prend à la source entière. Je ne sais pas si j'ai cliqué sur la mauvaise chose, mais même si je passais la source au clair, je n'ai rien trouvé. Je vais devoir télécharger et voir si je peux le trouver à travers l'IDE. – rball

1

Je vous envoie une proposition; fonctionne avec des exceptions contrelled et uncontrolled.

public class CodeExceptionToHttpFilter : FilterAttribute, IExceptionFilter 
{ 
    public CodeExceptionToHttpFilter() 
    { 
     Order = 2; 
    } 
    public void OnException(ExceptionContext filterContext) 
    { 
     var codeException = filterContext.Exception as CodeException; 
     var response = filterContext.RequestContext.HttpContext.Response; 
    response.StatusCode = (codeException == null)? 550: 551; 
     response.ContentType = MediaTypeNames.Text.Plain; 
     response.Charset = "utf-8"; 
     response.Write(filter.Exception.Message); 
     filterContext.ExceptionHandled = true; 
     response.TrySkipIisCustomErrors = true; 
    } 

}

Plus d'info sur mon blog. http://rodrigopb.wordpress.com/2012/11/28/gestion-de-errores-en-peticiones-ajax-a-mvc/

Questions connexes