Я использую ASP.Net MVC, но это относится к любой среде.
Я делаю Ajax-вызов на мой сервер, который большую часть времени возвращает простой старый HTML, однако, если возникает ошибка, я бы хотел, чтобы он возвращал объект JSON с сообщением о состоянии (и некоторые другие вещи). Похоже, для опции dataType
в вызове jQuery нет способа справиться с этим хорошо. По умолчанию кажется, что он анализирует все как html, что приводит к заполнению <div>
"{ status: 'error', message: 'something bad happened'}"
.
[Редактировать] Игнорирование объекта dataType
и определение jQuery также не работает. Он рассматривает тип результата как string
и обрабатывает его как HTML.
Одно из решений, которое я нашел, - попытаться проанализировать объект результата как JSON. Если это работает, мы знаем, что это объект JSON. Если он вызывает исключение, это HTML:
$.ajax({
data: {},
success: function(data, textStatus) {
try {
var errorObj = JSON.parse(data);
handleError(errorObj);
} catch(ex) {
$('#results').html(data);
}
},
dataType: 'html', // sometimes it is 'json' :-/
url: '/home/AjaxTest',
type: 'POST'
});
Тем не менее, использование Исключения таким образом кажется мне довольно плохим дизайном (и, по меньшей мере, не интуитивным). Есть ли способ лучше? Я думал об упаковке всего ответа в объект JSON, но в этом случае я не думаю, что это вариант.
Вот решение, которое я получил от Стива Уилкока:
// ASP.NET MVC Action:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AjaxTest(int magic) {
try {
var someVal = GetValue();
return PartialView("DataPage", someVal);
} catch (Exception ex) {
this.HttpContext.Response.StatusCode = 500;
return Json(new { status = "Error", message = ex.Message });
}
}
// jQuery call:
$.ajax({
data: {},
success: function(data, textStatus) {
$('#results').html(data);
},
error: function() {
var errorObj = JSON.parse(XMLHttpRequest.responseText);
handleError(errorObj);
},
dataType: 'html',
url: '/home/AjaxTest',
type: 'POST'
});