Как сообщить об ошибке в $.ajax без исключения исключения в MVC-контроллере?
У меня есть контроллер и метод, как определено...
[HttpPost]
public ActionResult UpdateUser(UserInformation model){
// Instead of throwing exception
throw new InvalidOperationException("Something went wrong");
// I need something like
return ExecutionError("Error Message");
// which should be received as an error to my
// $.ajax at client side...
}
Проблемы с исключениями
- Мы должны регистрировать исключения в случае ошибок устройства или сети, таких как ошибки подключения к SQL.
- Эти сообщения напоминают сообщения о проверке для пользователей, мы не хотим регистрироваться.
- Выбрасывание исключений также наводняет средство просмотра событий.
Мне нужен простой способ сообщить о некотором настраиваемом HTTP-статусе в мой вызов $.ajax, чтобы он вызывал ошибку на стороне клиента, но я не хочу бросать ошибку.
UPDATE
Я не могу изменить клиент script, потому что он становится несовместимым с другим источником данных.
До сих пор HttpStatusCodeResult должен работать, но это IIS вызывает здесь проблему. Независимо от того, какое сообщение об ошибке я установил, попробовал все ответы, но я все равно получаю сообщение по умолчанию.
Ответы
Ответ 1
Здесь отображаются коды состояния HTTP. С Ajax вы сможете обрабатывать их соответственно.
[HttpPost]
public ActionResult UpdateUser(UserInformation model){
if (!UserIsAuthorized())
return new HttpStatusCodeResult(401, "Custom Error Message 1"); // Unauthorized
if (!model.IsValid)
return new HttpStatusCodeResult(400, "Custom Error Message 2"); // Bad Request
// etc.
}
Вот список определенных кодов состояния.
Ответ 2
Описание
Как вернуть объект на свою страницу и проанализировать это в обратном вызове ajax
.
Пример
[HttpPost]
public ActionResult UpdateUser(UserInformation model)
{
if (SomethingWentWrong)
return this.Json(new { success = false, message = "Uuups, something went wrong!" });
return this.Json(new { success=true, message=string.Empty});
}
JQuery
$.ajax({
url: "...",
success: function(data){
if (!data.success)
{
// do something to show the user something went wrong using data.message
} else {
// YES!
}
}
});
Ответ 3
Вы можете создать вспомогательный метод в базовом контроллере, который вернет ошибку сервера, но с вашим пользовательским кодом состояния. Пример:
public abstract class MyBaseController : Controller
{
public EmptyResult ExecutionError(string message)
{
Response.StatusCode = 550;
Response.Write(message);
return new EmptyResult();
}
}
Вы вызовете этот метод в своих действиях, когда это необходимо.
В вашем примере:
[HttpPost]
public ActionResult UpdateUser(UserInformation model){
// Instead of throwing exception
// throw new InvalidOperationException("Something went wrong");
// The thing you need is
return ExecutionError("Error Message");
// which should be received as an error to my
// $.ajax at client side...
}
Ошибки (включая пользовательский код "550" ) можно обрабатывать глобально на стороне клиента следующим образом:
$(document).ready(function () {
$.ajaxSetup({
error: function (x, e) {
if (x.status == 0) {
alert('You are offline!!\n Please Check Your Network.');
} else if (x.status == 404) {
alert('Requested URL not found.');
/*------>*/ } else if (x.status == 550) { // <----- THIS IS MY CUSTOM ERROR CODE
alert(x.responseText);
} else if (x.status == 500) {
alert('Internel Server Error.');
} else if (e == 'parsererror') {
alert('Error.\nParsing JSON Request failed.');
} else if (e == 'timeout') {
alert('Request Time out.');
} else {
alert('Unknow Error.\n' + x.responseText);
}
}
});
});
Ответ 4
Это класс. Я написал исключения отправлений обратно в ajax-запросы как JSON
public class FormatExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult()
{
ContentType = "application/json",
Data = new
{
name = filterContext.Exception.GetType().Name,
message = filterContext.Exception.Message,
callstack = filterContext.Exception.StackTrace
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
else
{
base.OnException(filterContext);
}
}
}
Он регистрируется в MVC в файле приложения Global.asax.cs следующим образом:
GlobalFilters.Filters.Add(new FormatExceptionAttribute());
Ответ 5
Я использую этот Частный класс для ошибок Ajax
public class HttpStatusCodeResultWithJson : JsonResult
{
private int _statusCode;
private string _description;
public HttpStatusCodeResultWithJson(int statusCode, string description = null)
{
_statusCode = statusCode;
_description = description;
}
public override void ExecuteResult(ControllerContext context)
{
var httpContext = context.HttpContext;
var response = httpContext.Response;
response.StatusCode = _statusCode;
response.StatusDescription = _description;
base.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
base.ExecuteResult(context);
}
}
Код состояния - это настраиваемый код состояния HTTP и глобальная функция ошибки Ajax. Я тестирую его как:
MyNsp.ErrorAjax = function (xhr, st, str) {
if (xhr.status == '418') {
MyNsp.UI.Message("Warning: session expired!");
return;
}
if (xhr.status == "419") {
MyNsp.UI.Message("Security Token Missing");
return;
}
var msg = 'Error: ' + (str ? str : xhr.statusText);
MyNsp.UI.Message('Error. - status:' + st + "(" + msg + ")");
return;
};
Ответ 6
Лучший способ, который я нашел, заключается в следующем:
// Return error status and custom message as 'errorThrown' parameter of ajax request
return new HttpStatusCodeResult(400, "Ajax error test");
Ответ 7
Основываясь на том, что опубликовал BigMike, это было тем, что я сделал в своем веб-проекте NON MVC/WEBAPI.
Response.ContentType = "application/json";
Response.StatusCode = 400;
Response.Write (ex.Message);
Для чего это стоит (и спасибо BigMike!), он отлично работал.
Ответ 8
error: function(data){
alert("Error");
}
Есть два полезных метода, которые ajax предоставляет
- success//сделать что-то на sucess
- ошибка//что-то делать с ошибкой или ошибкой