中间件中渲染Razor视图
前言
要解決的問題
當文章查找不到時直接執行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
總結
以上是生活随笔為你收集整理的中间件中渲染Razor视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4(10)-
- 下一篇: 架构演化:云原生时代开启之系列一演化篇