我正在尝试设置我的控制器,以便他们可以使用http错误代码将响应发送到ajax调用。例如,我有我的登录ajax调用和控制器操作:
[System.Web.Mvc.HttpPost, System.Web.Mvc.AllowAnonymous]
public ActionResult Login(string userName, string password, bool rememberMe, string returnUrl)
{
[...]
var loginError = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new StringContent("Lorem ipsum 2 " + ErrorMessages.LOGINERROR),
ReasonPhrase = "Lorem ipsum 2 " + ErrorMessages.LOGINERROR
};
throw new HttpResponseException(loginError);
}
$.ajax({
type: "POST",
url: url,
data: data,
dataType: "text",
success: callBack,
error: function () { console.log("Error..."); },
statusCode : {
401: function (result) {
console.log("Login failed (401): " + result);
}
}
});
我想有一些我做得不对的事情,如果有人可以指出它们会很可爱!
谢谢!
答案 0 :(得分:1)
而不是抛出异常只返回提供一些内容和设置响应代码的ActionResult。对于您的情况,您可以创建一些我称之为ExtendedJsonResult的东西:
public class ExtendedJsonResult : JsonResult
{
public ExtendedJsonResult(object data)
{
base.Data = data;
}
public int StatusCode { get; set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.StatusCode = this.StatusCode;
base.ExecuteResult(context);
}
}
然后在控制器中
return new ExtendedJsonResult("Some error")
{
StatusCode = 401,
};
您也可以返回现有的HttpStatusCodeResult
。
答案 1 :(得分:1)
请看这个解决方案:ASP.NET MVC Ajax Error handling
Darin Dimitrov 使用动作过滤器编写非常好的解决方案:
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new { success = false, error = filterContext.Exception.ToString() },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
然后,您可以为所有状态代码编写客户端错误处理,并将其用于ajax请求。