Проблема с отображением значимого сообщения об ошибке от AJAX call - PullRequest
1 голос
/ 18 марта 2020

Я вызываю обработчик Razor Pages из AJAX следующим образом:

$.ajax({
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    }
})
.fail(function (e) {
    alert(e.responseText);
});

А вот мой обработчик, который проверяет, что происходит в случае возникновения исключения:

public async System.Threading.Tasks.Task OnGetDelete(int id)
{
    throw new Exception("This is an exception.");
}

Если в мой обработчик выдается исключение, затем я хочу отобразить описание ошибки. Проблема в том, что e.responseText содержит way больше информации, чем я хочу показать пользователю. Он включает описание исключения, а также трассировку стека, заголовки и многое другое.

В приведенном выше примере я бы хотел отобразить только «Это исключение». Это мое единственное решение, чтобы попытаться разобрать сообщение с e.responseText? Это то, что делают другие люди?

1 Ответ

1 голос
/ 18 марта 2020

В приведенном выше примере я хотел бы отображать только «Это исключение».

Чтобы отобразить «Это исключение», вы можете использовать следующий код фрагмент:

.fail(function (e) {
    //console.log(e);
    var mes = e.responseText.split('\n')[0];
    alert(mes.substring(17, mes.length - 1));
})

Результат теста:

enter image description here

Обновление:

Если возможно, вы можете попытаться динамически перехватить исключение, возникающее в указанном методе обработчика c, а затем сгенерировать ожидаемый ответ, как показано ниже.

app.Use(async (context, next) =>
{
    try
    {
        await next();
    }
    catch (Exception ex)
    {

        if (context.Request.Path.StartsWithSegments("{request_path_here}") && context.Request.Query["handler"].Any())
        {
            if (context.Request.Query["handler"]== "Delete")
            {
                context.Response.StatusCode = 500;
                var result = System.Text.Json.JsonSerializer.Serialize(new { error = ex.Message });
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(result);
            }
        }
    }
});

responseText будет "{"error":"This is an exception."}", и вы можете получить сообщение об исключении, используя JSON.parse(e.responseText).error.

Результат теста:

enter image description here

...