在中间件中执行完MVC的处理之后检查返回状态,如果是错误状态就直接渲染视图并输出
实现方式就是在Configure中注入ICompositeViewEngine实例,构造视图上下文,再渲染视图为字符串,最后输出。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, ICompositeViewEngine engine) { app.Use(async (context, next) => { //因为只是在请求最后处理,所以这里直接就运行下一个中间件 await next(); //返回后检查是否出现错误的状态 if (context.Response.StatusCode >= 400) { var viewResult = engine.GetView("~/", "~/Views/Home/Privacy.cshtml", true); if (viewResult.Success) { //创建临时的StringWriter实例,用来配置到视图上下文中 using (var output = new StringWriter()) { //视图上下文对于视图渲染来说很重要,视图中的前后台交互都需要它 var viewContext = new ViewContext() { HttpContext = context, Writer = output, RouteData = new Microsoft.AspNetCore.Routing.RouteData() { //RouteData在这里传入视图,这样视图可以显示错误信息之类的数据 }, View = viewResult.View, FormContext = new FormContext(), ActionDescriptor = new Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor() }; //渲染 await viewResult.View.RenderAsync(viewContext); //输出到响应体 await context.Response.WriteAsync(output.ToString()); } } } });