沒有,有沒有辦法通過控制器的行動返回每一個可能的JSON這樣做是因爲結構會有所不同,這result
變量的性質將不一樣。
正確的方法是有一個自定義錯誤處理程序,它將攔截所有異常並將它們包裝在一個定義良好的JSON結構中。然後你可以在AJAX請求中使用錯誤回調來處理這種情況。
public class AjaxErrorHandler : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
ErrorMessage = filterContext.Exception.Message
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
這可以被註冊爲一個全球性的動作過濾器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AjaxErrorHandlerAttribute());
}
,並在客戶端上,你也可以擁有在同一頁上的所有AJAX請求的全局AJAX錯誤處理程序:
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
var json = $.parseJSON(jqXHR.response);
alert(json.ErrorMessage);
});
如何拋出異常?我試圖[HttpPost] [AjaxErrorHandler] 公共的ActionResult登錄(LogOnModel模型,串RETURNURL) { //一些代碼 如果(布拉布拉) 擲新的異常( 「BLABLA」); }但它沒有奏效。 – 2012-03-13 20:27:43
我試着用Ajax.BeginForm而不是Html.BeginForm。 AjaxErrorHandler會發生異常,但客戶端上的全局Ajax錯誤處理程序不會顯示消息。 – 2012-03-13 21:28:56