Asp.net core ASP.NET核心:用于在当前页面中显示异常消息的全局处理

Asp.net core ASP.NET核心:用于在当前页面中显示异常消息的全局处理,asp.net-core,error-handling,Asp.net Core,Error Handling,在我的应用程序中,我有一组“预期”的错误,因此它们不应该在发生时将用户重定向到完整的错误页面。例如,我想在当前页面上方的红色框中显示错误消息 我可以很容易地捕捉到模型操作上的错误,并在当前视图上显示消息,但我想知道如何在全局范围内执行该操作 我尝试了一个带有TempData的自定义中间件和一个带有ModelState的过滤器,但是我不知道如何将错误数据传递回当前页面 这适用于单个模型(在TempData中设置错误数据): 通过@hiiru的提示,我对配置选项进行了一番白费力气的探索,以找到一个有

在我的应用程序中,我有一组“预期”的错误,因此它们不应该在发生时将用户重定向到完整的错误页面。例如,我想在当前页面上方的红色框中显示错误消息

我可以很容易地捕捉到模型操作上的错误,并在当前视图上显示消息,但我想知道如何在全局范围内执行该操作

我尝试了一个带有TempData的自定义中间件和一个带有ModelState的过滤器,但是我不知道如何将错误数据传递回当前页面

这适用于单个模型(在TempData中设置错误数据):


通过@hiiru的提示,我对配置选项进行了一番白费力气的探索,以找到一个有效的解决方案

我的问题是中间件HandleError方法缺少调用:

        private void HandleError(HttpContext context, ApplicationError error) {
            var tempData = _tempFactory.GetTempData(context);
            tempData.Add("Error", error.Message);
            tempData.Save(); // this call was missing

            context.Response.Redirect(context.Request.Path);
        }
将其弹出后,tempdata将与重定向一起发送回原始页面。请注意,这是使用默认的基于cookie的临时数据,因此不需要特定的配置


现在,这是可行的,但可能不是最好的方法。

您的TempData是如何配置的?会话状态是否已启用?如果是,您的
启动顺序是什么?配置
,是在添加
应用程序错误中间件之前还是之后使用会话?感谢您更新解决方案!,我还学习了如何使用
ITempDataDictionaryFactory
(我自己还不需要使用它)
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);
        }
    }
        private void HandleError(HttpContext context, ApplicationError error) {
            var tempData = _tempFactory.GetTempData(context);
            tempData.Add("Error", error.Message);
            tempData.Save(); // this call was missing

            context.Response.Redirect(context.Request.Path);
        }