2013-03-04 3 views
0

Я пытаюсь настроить мои контроллеры, чтобы они могли использовать коды ошибок HTTP для отправки ответов на вызовы ajax. Так, например, у меня Логин АЯКС вызова и контроллер действия:Настройка HTTP-кода .Net MVC для вызовов 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); 
     } 
    } 
}); 

Я думаю, есть несколько вещей, которые я не буду делать правильно, если кто-то может указать на них, что было бы прекрасно!

Спасибо!

ответ

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

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 Запросы.