0

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

我在想有几件事我做的不对,如果有人能指出他们会很可爱!

谢谢!

4

2 回答 2

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.

于 2013-03-04T18:58:09.480 回答
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 请求。

于 2013-03-04T19:28:50.710 回答