web-dev-qa-db-fra.com

Comment définir le type de contenu d'une publication ajax jQuery de sorte que ASP.NET MVC puisse le lire?

J'ai quelques jQuery qui ressemble à ceci:

$.ajax({
     type: "POST",
     url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
     contentType: "application/json",
     success: refreshTransactions,
     error: function(xhr, ajaxOptions, thrownError) {
         alert("Failed to cancel subscription! Message:" + xhr.statusText);
     }
});

Si l'action appelée provoque une exception, elle sera finalement capturée par le fichier Global.asax Application_Error où j'ai du code comme celui-ci:

var ex = Server.GetLastError();
if (Request.ContentType.Contains("application/json"))
{
     Response.StatusCode = 500;
     Response.StatusDescription = ex.Message;
     Response.TrySkipIisCustomErrors = true;
}
else
{
     // some other way of handling errors ...
}

Lorsque j'exécute le script qui effectue la publication, Request.ContentType est toujours une chaîne vide et ne frappe donc pas le premier bloc if. Existe-t-il une autre valeur que je devrais mettre dans le "contentType" ajax? Ou y a-t-il un autre moyen pour moi de dire à asp.net que le type de contenu doit être "application/json"?

Clarification

Le but que j'essaie d'atteindre est de renvoyer le message d'exception à l'événement d'erreur ajax. Actuellement, même si le bloc IF est en train d'être contourné, l'événement d'erreur renvoie correctement une boîte d'alerte, mais le message est "Introuvable".

Comme vous pouvez le constater, j'essaie de définir le message d'exception sur Response.StatusDescription, auquel le xhr.statusText de l'erreur ajax est défini, selon moi.

13
Sailing Judo

Selon cet article: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery ne définit pas correctement le type de contenu spécifié quand il n'y a pas de données incluses. "

$.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: "WebService.asmx/WebMethodName",
  data: "{}",
  dataType: "json"
});
19
typeoneerror

Pour définir des en-têtes personnalisés dans XmlHTTPRequest, vous devez utiliser la fonction d'option beforeSend () dans l'appel jQuery AJAX. Utilisez cette fonction pour définir des en-têtes supplémentaires, comme décrit dans la documentation de l'API jQuery.

Exemple:

  $.ajax({
    type: "POST",
    url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
    beforeSend: function(xhr) {
      xhr.setRequestHeader( "Content-type", "application/json" );
    },
    success: refreshTransactions,
    error: function(xhr, ajaxOptions, thrownError) {
       alert("Failed to cancel subscription! Message:" + xhr.statusText);
    }
  });
6
Michael Bray

Si vous retournez toujours JSON pour les erreurs Ajax, vous pouvez simplement utiliser ce qui suit pour détecter qu'il s'agit d'un appel Ajax:

// jQuery sets a header of 'x-requested-with' in all requests
            string[] ajaxHeader = httpRequest.Headers.GetValues("x-requested-with");
            if (ajaxHeader != null && ajaxHeader.Length > 0)
            {
                return ajaxHeader[0].Equals("XMLHttpRequest", StringComparison.InvariantCultureIgnoreCase);
            }
            return false;
0
Keith Rousseau

Utilisez ceci pour le type de contenu par défaut.

$ .ajaxSetup ({ contentType: "application/json; charset = utf-8", });

0
varun