В моем приложении есть набор ошибок, которые «ожидаются», и поэтому они не должны перенаправлять пользователя на полную страницу ошибок при их возникновении. Например, я хотел бы показать сообщение об ошибке в красном поле над текущей страницей.
Я могу легко уловить ошибку в действии модели и показать сообщение в текущем представлении, но мне было интересно, как это сделать глобально.
Я попробовал пользовательское промежуточное ПО с TempData и фильтр с ModelState, но не могу понять, как на самом деле передать данные об ошибках обратно на текущую страницу.
Это работает для одной модели (установка данных об ошибках в TempData):
public async Task<IActionResult> OnPost() {
try {
// methodThatThrows
}
catch (ApplicationError e) {
TempData["Error"] = e.Message;
return RedirectToPage("Current_Page");
}
return RedirectToPage("Other_Page");
}
По какой-то причине это не работает (в глобальном промежуточном программном обеспечении), так как TempData пуст после завершения перенаправления. Кроме того, настройка промежуточного программного обеспечения на самом деле не работает с отображением других, более критических ошибок на странице обычной ошибки:
public class ApplicationErrorMiddleware {
private readonly RequestDelegate _next;
private readonly ITempDataDictionaryFactory _tempFactory;
public ApplicationErrorMiddleware(RequestDelegate next, ITempDataDictionaryFactory tempFactory) {
_next = next;
_tempFactory = tempFactory;
}
public async Task InvokeAsync(HttpContext httpContext) {
try {
await _next(httpContext);
}
catch (ApplicationError ex) {
HandleError(httpContext, ex);
}
}
private void HandleError(HttpContext context, ApplicationError error) {
var tempData = _tempFactory.GetTempData(context);
tempData.Add("Error", error.Message);
context.Response.Redirect(context.Request.Path);
}
}