2010-02-04 13 views
13

Mam jQuery, który wygląda tak:Jak ustawić contentType posta ajax jQuery tak, aby ASP.NET MVC mógł go odczytać?

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

Jeśli akcja miano powoduje wyjątek będzie ostatecznie odebrano przez Global.asax Application_Error gdzie mam trochę kodu:

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

Kiedy wykonuję skrypt, który robi post, Request.ContentType jest zawsze pustym łańcuchem i dlatego nie uderza w pierwszy blok if. Czy jest jakaś inna wartość, którą powinienem umieścić w "contentType" ajax? Czy jest inny sposób, aby powiedzieć asp.net, że typem treści powinien być "application/json"?

Wyjaśnienie

Celem staram się osiągnąć to, aby przekazać komunikat wyjątku powrotem do ajax zdarzenia błędu. Obecnie, mimo że blok IF jest pomijany, zdarzenie błędu poprawnie zgłasza okienko alertu, ale komunikat "Nie znaleziono".

Jak widać, próbuję ustawić komunikat o wykryciu na Response.StatusDescription, który moim zdaniem Xhr.statusText w błędzie ajax jest ustawiony na.

Odpowiedz

18

Accordiing do tego artykułu : http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery nie ustawia prawidłowo określonego typu zawartości, gdy nie ma danych."

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

Zmieniło w jQuery 1.4, teraz zawsze wysyła typ zawartości ... Ważna uwaga :) http://api.jquery.com/jQuery.ajax/ –

+0

Przetestowałem tę metodę na zewnątrz i to działa. Używamy jQuery 1.3.2 tutaj. Z tego, co Nick opisuje, wynika, że ​​mój kod w pytaniu powinien działać z wersją 1.4. –

+1

To jest poprawna odpowiedź. Modyfikowanie ustawienia typu zawartości obiektu XHR w beforeSend nie działa poprawnie w niektórych przeglądarkach, a usługa zwróci XML zamiast JSON. –

6

Aby ustawić niestandardowe nagłówki w XmlHTTPRequest, należy użyć funkcji opcji beforeSend() w wywołaniu AJAX jQuery. Użyj tej funkcji, aby ustawić dodatkowe nagłówki, zgodnie z opisem w .

Przykład:

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

Jeśli zawsze powrocie json błędów Ajax, można po prostu użyć następujących czynności, aby wykryć, że jest to wywołanie 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

Użyj tego do domyślnego typu zawartości.

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

Powiązane problemy