Как вернуть ошибку из действия ASP.NET MVC

Я использую ASP.NET MVC для разработки веб-сайта. Я использую jquery для функциональности AJAX. В методах действий я хочу вернуть некоторую ошибку, чтобы сообщить, что вход неверен или что действие не может быть выполнено. В таких случаях ошибки я ожидаю, что обработчик ошибок jquery ajax будет вызван, и я могу предпринять соответствующие действия там. Я не нашел способ, как это сделать. Ниже приведен мой метод действий.

В случае ошибок, что я должен отправлять из Action, чтобы запустить обработчик ошибок jquery?

public ActionResult AddToFavourites(int entityId, string entityType)
    {

        if (!Request.IsAjaxRequest())
            throw new InvalidOperationException("This action can be called only in async style.");

        try
        {
            RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType);
            string status = "";

            if (typeOfFavourite == RBParams.EntityType.BusinessEntity)
            {
                status = MarkFavouriteEntity(entityId);
            }
            else if (typeOfFavourite == RBParams.EntityType.Review)
            {
                status = MarkFavouriteReview(entityId);
            }
            else
            {
                throw new InvalidOperationException("The type of the entity is not proper");
            }

            return Content(status);

        }
        catch (Exception ex)
        {

            return Content("Error");
        }
    }

Ответы

Ответ 1

Ваш обработчик ошибок ajax вызывается, когда действие не возвращает ожидаемый код состояния. Это, например, срабатывает, если действие не было обнаружено, или если вы выбрали исключение, которое вы не обрабатываете. В вашем случае это будет вызвано, если вы не поймаете ошибку в своем действии (поскольку действие вернет код состояния 500).

Я бы, однако, не делал этого таким образом, поскольку это, вероятно, ожидаемая ошибка. Я бы скорее вернул json, когда вы преуспеете, и когда у вас есть ошибка. Затем вы можете указать, является ли это успешным вызовом или нет. Что-то вроде этого:

public ActionResult AddToFavourites(int entityId, string entityType)
{

    if (!Request.IsAjaxRequest())
        throw new InvalidOperationException("This action can be called only in async style.");

    try
    {
        RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType);
        string status = "";

        if (typeOfFavourite == RBParams.EntityType.BusinessEntity)
        {
            status = MarkFavouriteEntity(entityId);
        }
        else if (typeOfFavourite == RBParams.EntityType.Review)
        {
            status = MarkFavouriteReview(entityId);
        }
        else
        {
            throw new InvalidOperationException("The type of the entity is not proper");
        }

        return Json(new { Success = true, Status = status });

    }
    catch (Exception ex)
    {

        return Json(new { Success = false, Message = ex.Message });
    }
}

Затем вы обрабатываете его так же, как успешный вызов. Вы просто проверяете свойство Success вашего ответа json. Затем вы обрабатываете непредвиденные ошибки в обратном вызове ошибки.

Ответ 2

Ответ Маттиаса Якобсона правильный. Но я думаю, что лучший способ вернуть ошибку в jQuery - это создать JSON и отправить его со статусом 500. Однако, когда я это сделал и попытался развернуть мой веб-сайт MVC с помощью IIS 7, я понял, что он возвращает мне обычай вместо сообщения.

Код был...

catch (Exception ex)
{
    Response.StatusCode = 500;
    return Json(new { error = ex.Message });
}

Но потом я увидел этот поток, который привел меня к этому веб-сайту (от Рика Стралла).

В целом, я понял, что вам нужно сказать IIS, чтобы не вводить страницу пользовательских ошибок, поэтому вам нужен этот флаг (в global.asax или в catch):

Response.TrySkipIisCustomErrors = true;

Итак, в jQuery код сохраняет то же самое:

$.ajax({...})
.done(function (result) {...})
.fail(function (e) { 
   console.log(e.responseJSON.error);
});

Ответ 3

вы shoud config jquery для обработки ошибки:

$.ajaxSetup({
    error: function(xhr) {
        alert(xhr.statusText);
    }
})