我正在从MVC视图调用web服务,并希望在异常抛出时使用jquery ajax错误功能。
我试图从我的MVC业务层抛出一个自定义创建的异常到我的表示层控制器,并将其作为json响应重新抛出。
我可以成功地抛出我的自定义异常,问题是它作为一个HTML视图。我已经看到了声明自定义错误响应的方法,但我希望能够直接将异常作为JSON重新抛出。
任何想法?
Javascript:$.ajax({
type: "POST",
url: 'create',
data: "{userDetails:" + JSON.stringify(details) + "}",
contentType: "application/json; charset=utf-8",
success: function (data) {
data = data.d;
redirectSuccess();
},
error: function(err) {
//display thrown exception here
}
});
c
public JsonResult create(MyModel.New details)
{
try
{
Library.insert(details);
return Json(true);
}
catch (Exception ex)
{
throw;
}
}
提前感谢您的帮助!
我最终想出了一个合适的解决方案。
对于任何想要类似于我所问问题的答案的人,我所做的是声明一个自定义过滤器。其中的主要部分是将过滤器结果设置为JSON返回,但即使这样,它也会在jquery ajax调用中作为成功返回,因为它返回的状态为200,而jquery ajax将其读取为成功。
Jquery ajax读取任何超过200的状态作为错误,所以你可以看到我将状态代码更改为我创建并将记录的自定义数字,因此Jquery ajax看到错误并将其抛出ajax错误。
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.HttpContext.Response.StatusCode = 11001;
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new { success = false, error = filterContext.Exception.ToString() },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
要引用当前过滤器,只需向函数添加错误处理程序属性,如下面的第一行所示:
[MyErrorHandler]
public JsonResult create(MyModel.New details)
{
try
{
Library.insert(details);
return Json(true);
}
catch (Exception ex)
{
return Json(ex.Message);
}
}
我不认为它的工作方式,你需要传递异常前端作为响应。
public JsonResult create(MyModel.New details)
{
try
{
Library.insert(details);
return Json(true);
}
catch (Exception ex)
{
return Json(ex.Message);
}
}
然后用JS处理成功。
$.ajax({
type: "POST",
url: 'create',
data: "{userDetails:" + JSON.stringify(details) + "}",
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data.Message)
{
//display error
}else{
data = data.d;
redirectSuccess();}
},
error: function(err) {
//display thrown exception here
}
});