日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中间件中渲染Razor视图

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中间件中渲染Razor视图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

上一篇文章《ASP.NET Core 奇技淫巧(1):中間件實現服務端靜態化緩存》中介紹了中間件的使用方法、以及使用中間件實現服務端靜態化緩存的功能。本系列文章取名“奇技淫巧”不是沒道理的,因為這寫技巧都是我最近在做的公司實際項目中的一些奇怪的需求之后總結而來的……

要解決的問題

好了,本篇說說如何在中間件中渲染Razor視圖。之所以會有這個技巧,是因為我們有個需求:

需要在所有返回404狀態的路由都輸出一個特定視圖。
比如當有id=1的文章,而沒有id=2的文章時,那么/url/1.html展示文章詳情頁,/url/2.html展示404視圖。

所以,要實現這個需求只有兩種辦法:

  • 當文章查找不到時直接執行return View("404")返回404視圖。

  • 在中間件中執行完MVC的處理之后檢查返回狀態,如果是錯誤狀態就直接渲染視圖并輸出。

  • 由于CMS系統中不止一處需要返回404狀態,所以因為用代碼整潔作為懶惰的借口,決定嘗試第二個方法。

    實現

    實現方式很簡單,就是在Configure中注入ICompositeViewEngine實例,構造視圖上下文,再渲染視圖為字符串,最后輸出。其它的分析就在代碼注釋中說明吧

    直接上代碼:

  • 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视图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。