我试图按照此链接中的建议将错误返回到对控制器的调用,以便客户端可以采取适当的措施。javascript通过jqueryAJAX调用控制器。仅在不将状态设置为error的情况下,我才可以重新获得Json对象。这是示例代码
if (response.errors.Length > 0) Response.StatusCode = (int)HttpStatusCode.BadRequest; return Json(response);
如果没有设置状态码,我会得到Json。如果设置状态代码,则会返回状态代码,但不会返回Json错误对象。
更新 我想将Error对象作为JSON发送,以便可以处理ajax的错误回调。
我在这里找到解决方案
我必须创建一个动作过滤器来覆盖MVC的默认行为
这是我的异常类
class ValidationException : ApplicationException { public JsonResult exceptionDetails; public ValidationException(JsonResult exceptionDetails) { this.exceptionDetails = exceptionDetails; } public ValidationException(string message) : base(message) { } public ValidationException(string message, Exception inner) : base(message, inner) { } protected ValidationException( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } }
请注意,我有用于初始化JSON的构造函数。这是动作过滤器
public class HandleUIExceptionAttribute : FilterAttribute, IExceptionFilter { public virtual void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } if (filterContext.Exception != null) { filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; filterContext.Result = ((ValidationException)filterContext.Exception).myJsonError; } }
现在有了动作过滤器,我将用filter属性装饰控制器
[HandleUIException] public JsonResult UpdateName(string objectToUpdate) { var response = myClient.ValidateObject(objectToUpdate); if (response.errors.Length > 0) throw new ValidationException(Json(response)); }
引发错误时,将调用实现IExceptionFilter的动作过滤器,并在错误回调上返回客户端上的Json。