2013-03-04 59 views
0

我试图建立我的控制器,这样他们可以使用HTTP错误代码来响应发送到AJAX调用。因此,例如,我有我的登录Ajax调用控制器动作:设置.NET MVC HTTP阿贾克斯错误代码调用

[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); 
     } 
    } 
}); 

我想有几件事情我没有做对的,如果有人能指出来,这将是可爱的!

谢谢!

回答

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

+0

感谢这帮了我很多。但是,代码中存在一些问题,我对其进行了修正。 – NaveenBhat 2013-09-05 11:12:46

1

看看这个解决方案:ASP.NET MVC Ajax Error handling

达林季米特洛夫写用行动过滤器非常好的解决方案:

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要求。