我正在使用ASP.Net MVC,但这适用于任何框架.
我正在对我的服务器进行一个Ajax调用,大部分时间返回纯旧的HTML,但是如果有一个错误,我希望它返回一个状态消息的JSON对象(还有一些其他的东西). jQuery调用中的dataType选项似乎没有办法处理这个.默认情况下,它似乎将所有内容解析为html,导致< div>填充“{status:’error’,message:’something bad happen’}”.
[编辑]忽略dataType对象,让jQuery找出不起作用.它将结果的类型视为字符串,并将其视为HTML.
我想出了一个解决方案是尝试将结果对象解析为JSON.如果这样工作,我们知道它是一个JSON对象. 200新新新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新旗新新旗新新旗新新旗新新旗新旗新新旗新新旗新新旗新
$.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对象中,但在这种情况下,我不认为这是一个选择.
这是我从Steve Willcock得到的解决方案:
// 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: {},textStatus) {
$('#results').html(data);
},error: function() {
var errorObj = JSON.parse(XMLHttpRequest.responseText);
handleError(errorObj);
},url: '/home/AjaxTest',type: 'POST'
});
解决方法
对于您的JSON错误,您可以从服务器返回500个状态代码,而不是200.然后,jQuery客户端代码可以使用$.ajax函数上的错误:处理程序进行错误处理.在500响应中,您可以从responseText解析JSON错误对象,在200响应中,您可以正常地将HTML放在div中.