Подтвердить что ты не робот

Как сообщить об ошибке в $.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 вызывает здесь проблему. Независимо от того, какое сообщение об ошибке я установил, попробовал все ответы, но я все равно получаю сообщение по умолчанию.

4b9b3361

Ответ 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
  • ошибка//что-то делать с ошибкой или ошибкой