前言
要解决的问题
当文章查找不到时直接执行
return View("404")返回404视图。
在中间件中执行完MVC的处理之后检查返回状态,如果是错误状态就直接渲染视图并输出。
实现
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ICompositeViewEngine engine)
 
- {
 
-     app.Use(async (context, next) =>
 
-     {
 
-         //因为只是在请求最后处理,所以这里直接就运行下一个中间件
 
-         await next();
 
-         //返回后检查是否出现错误的状态
 
-         if (context.Response.StatusCode >= 400)
 
-         {
 
-             context.Response.StatusCode = (int)HttpStatusCode.NotFound;
 
-             //ContentType设置为text/html,使浏览器以正常页面的格式显示
 
-             context.Response.ContentType = "text/html";
 
-             //指向特定的视图
 
-             var viewResult = engine.GetView("~/", "~/Views/Default/Home/Error.cshtml", true);
 
 
-             if (!viewResult.Success)
 
-                 await context.Response.WriteAsync("OMG! 连错误视图都找不到了。。");
 
-             //创建临时的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());
 
-             }
 
-         }
 
-     });
 
 
-     //后面是Mvc的中间件,执行Mvc的处理
 
-     //...app.UseMvc
 
- }
 
 
  总结
   相关文章:
 -  ASP.NET Core缓存静态资源 
-  中间件实现服务端静态化缓存 
 
  原文:https://yangshunjie.com/A-Middleware-Implement-For-Rendering-Razor-Views-In-AspNetCore.html
 
 .NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
