为ajax调用设置.Net MVC http错误代码

时间:2013-03-04 18:42:25

标签: ajax asp.net-mvc

我正在尝试设置我的控制器,以便他们可以使用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);
        }
    }
});

我想有一些我做得不对的事情,如果有人可以指出它们会很可爱!

谢谢!

2 个答案:

答案 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请求。