Как я могу установить contentType сообщения jQuery ajax, чтобы ASP.NET MVC мог его прочитать?
У меня есть jQuery, который выглядит так:
$.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);
}
});
Если вызываемое действие вызывает исключение, оно в конечном итоге будет воспринято с помощью приложения Global.asax Application_Error, где у меня есть такой код:
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 ...
}
Когда я выполняю script, который делает запись, Request.ContentType всегда является пустой строкой и поэтому не попадает в первый блок if. Есть ли какая-то другая ценность, которую я должен помещать в ajax "contentType"? Или есть ли другой способ сообщить asp.net, что тип содержимого должен быть "application/json"?
Разъяснение
Цель, которую я пытаюсь достичь, - передать сообщение об ошибке обратно в событие ошибки ajax. В настоящее время, несмотря на то, что блок IF блокируется, событие ошибки корректно выдает окно предупреждения, но сообщение "Не найдено".
Как вы можете видеть, я пытаюсь установить сообщение exeception в Response.StatusDescription, которое, как мне кажется, имеет значение xhr.statusText в ошибке ajax.
Ответы
Ответ 1
В соответствии с этой статьей: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ "jQuery неправильно задает указанный тип содержимого, когда нет данных."
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "WebService.asmx/WebMethodName",
data: "{}",
dataType: "json"
});
Ответ 2
Чтобы настроить пользовательские заголовки в XmlHTTPRequest, вам нужно использовать функцию опции beforeSend() в вызове JQuery AJAX. Используйте эту функцию для установки дополнительных заголовков, как описано в jQuery API documenation.
Пример:
$.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);
}
});
Ответ 3
Если вы всегда возвращаете json для ошибок Ajax, вы можете просто использовать следующее, чтобы обнаружить, что это вызов 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;
Ответ 4
Используйте этот тип содержимого по умолчанию.
$. AjaxSetup ({ contentType: "application/json; charset = utf-8", });