前言
要解决的问题
当文章查找不到时直接执行
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
}
总结
相关文章:
原文:https://yangshunjie.com/A-Middleware-Implement-For-Rendering-Razor-Views-In-AspNetCore.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com