2010-02-04 18 views
13

tengo un poco de jQuery que tiene este aspecto:¿Cómo puedo configurar el contentType de una publicación jQuery ajax para que ASP.NET MVC pueda leerla?

$.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 la acción que se llama provoca una excepción que en última instancia son recogidas por el Global.asax Application_Error donde tengo algo de código como esto:

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 ... 
} 

Cuando ejecuto el script que realiza la publicación, Request.ContentType siempre es una cadena vacía y, por lo tanto, no da en el primer bloque si. ¿Hay algún otro valor que debería poner en el ajax "contentType"? ¿O hay otra forma de decirle a asp.net que el tipo de contenido debe ser "application/json"?

Aclaración

El objetivo que estoy tratando de lograr es hacer pasar el mensaje de excepción posterior al evento error de Ajax. Actualmente, aunque el bloque IF se está pasando por alto, el evento de error arroja correctamente un cuadro de alerta pero el mensaje es "No encontrado".

Como puede ver, estoy tratando de establecer el mensaje de excepción en Response.StatusDescription, que creo que el xhr.statusText en el error ajax está establecido en.

Respuesta

18

Accordiing a este artículo : http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery no establece correctamente el tipo de contenido especificado cuando no hay datos incluidos."

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

Esto cambió en jQuery 1.4, ahora se envía siempre el tipo de contenido ... nota importante :) http://api.jquery.com/jQuery.ajax/ –

+0

He probado este método y que hace el trabajo. Estamos utilizando jQuery 1.3.2 aquí. Por lo que Nick describe, parece que mi código en la pregunta debería funcionar con 1.4. –

+1

Esta es la respuesta correcta. La modificación de la configuración del tipo de contenido del objeto XHR en beforeSend no funciona bien en algunos navegadores, y el servicio devolverá XML en lugar de JSON. –

6

Para establecer encabezados personalizados en XmlHTTPRequest, debe utilizar la función de opción beforeSend() en la llamada jQuery AJAX. Utilice esa función para establecer encabezados adicionales, como se describe en jQuery API documenation.

Ejemplo:

$.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); 
    } 
    }); 
0

Si siempre está devolviendo JSON de errores Ajax, a continuación, puedes utilizar el siguiente para detectar que se trata de una llamada de 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

Use esto para el tipo de contenido predeterminado.

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

Cuestiones relacionadas