asp.net core 系列 8 Razor框架路由(下)

来源:https://www.cnblogs.com/MrHSR/archive/2019/01/15/10267717.html
-Advertisement-
Play Games

三.頁面路由操作約定 接著上篇講asp.net core 系列 7 Razor框架路由。在上篇繼續第三節 "頁面路由操作約定" 的最後一小節 AddPageRoute 。 使用 AddPageRoute 配置路由,該路由與指定頁面關聯, 使用指定的路由生成頁面鏈接。 AddPageRoute 使用 ...


三.頁面路由操作約定

   接著上篇講asp.net core 系列 7 Razor框架路由。在上篇繼續第三節 "頁面路由操作約定" 的最後一小節 AddPageRoute 。

 

  3.3. 配置頁面路由AddPageRoute

    使用 AddPageRoute 配置路由,該路由與指定頁面關聯, 使用指定的路由生成頁面鏈接。 AddPageRoute 使用 AddPageRouteModelConvention 建立路由。

    示例應用為 Privacy.cshtml 創建指向 /ThePrivacyPage 的路由:

    options.Conventions.AddPageRoute("/Privacy", "ThePrivacyPage/{text?}");

    可以通過原有 / Privacy預設路由訪問“Privacy”頁面。http://localhost:60397/Privacy

    也可以通過上面自定義的頁面路由訪問Privacy頁面。 http://localhost:60397/ThePrivacyPage

    示例應用的“Privacy”頁面自定義路由允許使用可選的 text 路由段 ({text?})。 該頁面還在其 @page 指令中包含此可選段,以便訪問者在 /Privacy 路由中訪問該頁面。在呈現的頁面中,為Privacy鏈接生成的 URL 顯示了已更新的路由,如下所示:

 

四. 頁面模型操作約定

    實現 IPageApplicationModelProvider 的預設頁面模型提供程式可調用約定,這些約定旨在為頁面模型配置提供擴展點。 在生成和修改頁面發現及處理方案時,可使用這些約定。這裡繼續使用上篇講的 AddHeaderAttribute 類(一個ResultFilterAttribute)來應用響應標頭。

    

  4.1 文件夾應用模型約定

    使用 AddFolderApplicationModelConvention 創建並添加 IPageApplicationModelConvention,後者可以為指定文件夾下的所有頁面調用 PageApplicationModel 實例上的操作。   示例演示瞭如何使用 AddFolderApplicationModelConvention 將標頭 OtherPagesHeader 添加到應用的OtherPages 文件夾內的頁面:

            //文件夾應用模型約定
                        options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model =>
                        {
                            model.Filters.Add(new AddHeaderAttribute(
                                "OtherPagesHeader", new string[] { "OtherPages Header Value" }));
                        });

    在OtherPages/Page1 中請求示例的 Page1 頁面,並檢查標頭以查看結果:

 

  4.2 頁面應用模型約定    

    使用AddPageApplicationModelConvention創建並添加IPageApplicationModelConvention ,它在調用操作PageApplicationModel頁使用指定的名稱。示例演示瞭如何使用 AddPageApplicationModelConvention 將標頭 AboutHeader 添加到“About”頁面:

                    //頁面應用模型約定
                        options.Conventions.AddPageApplicationModelConvention("/Privacy", model =>
                        {
                           
                            model.Filters.Add(new AddHeaderAttribute(
                                "PrivacyHeader", new string[] { "Privacy Header Value" }));
                        });

    請求示例的 Privacy頁面,並檢查標頭以查看結果:

 

  4.3 配置篩選器

    ConfigureFilter 可配置要應用的指定篩選器。 用戶可以實現篩選器類,但示例應用演示瞭如何在 Lambda 表達式中實現篩選器,該篩選器在後臺作為可返回篩選器的工廠實現:

                        options.Conventions.ConfigureFilter(model =>
                        {
                            if (model.RelativePath.Contains("OtherPages/Page2"))
                            {
                                return new AddHeaderAttribute(
                                    "OtherPagesPage2Header",
                                    new string[] { "OtherPages/Page2 Header Value" });
                            }
                           return new Pages.OtherPages.EmptyFilter();
                        });
    public class EmptyFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // do something before the action executes
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // do something after the action executes
        }
    }

    頁面應用模型用於檢查指向 OtherPages 文件夾中 Page2 頁面的段的相對路徑。 如果條件通過,則添加標頭。 如果不通過,則應用 EmptyFilter。由於 Razor 頁面會忽略操作篩選器,因此,如果路徑不包含 OtherPages/Page2EmptyFilter 會按預期發出空操作指令。

    在OtherPages/Page2中請求示例的 Page2 頁面,並檢查標頭以查看結果:

   4.4 配置篩選器工廠 

    除了4.3的 Lambda 表達式配置篩選器。還可以對ConfigureFilter 配置指定的工廠,以將篩選器應用於所有 Razor 頁面。示例應用說明如何使用篩選器工廠將具有兩個值的標頭 FilterFactoryHeader 添加到應用的頁面:

     options.Conventions.ConfigureFilter(new AddHeaderWithFactory());
public class AddHeaderWithFactory : IFilterFactory
    {
        // Implement IFilterFactory
        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
        {
            return new AddHeaderFilter();
        }

      /// <summary>
      /// IResultFilter繼承了IFilterMetadata介面
      /// </summary>
     private class AddHeaderFilter : IResultFilter
        {
            public void OnResultExecuting(ResultExecutingContext context)
            {
                context.HttpContext.Response.Headers.Add(
                    "FilterFactoryHeader",
                    new string[]
                    {
                    "Filter Factory Header Value 1",
                    "Filter Factory Header Value 2"
                    });
            }

            public void OnResultExecuted(ResultExecutedContext context)
            {
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

    在/About 中請求示例的“About ”頁面,並檢查標頭以查看結果:

 

五.替換預設的頁面應用模型

         Razor 頁面使用 IPageApplicationModelProvider 介面創建 DefaultPageApplicationModelProvider。 用戶可以從預設模型提供程式繼承,以便為處理程式提供自己的實現邏輯。 預設實現是:“未命名的處理程式方法”和“預設已命名處理程式的約定方法。

  

  5.1 預設的未命名處理程式方法

    未命名處理程式方法是以:Http 謂詞為處理的程式方法,遵循以下約定:On<HTTP verb>[Async](追加 Async 是可選操作,但建議為非同步方法執行此操作)。主要的三個Http 謂詞:get、post、delete。

未命名處理程式方法

操作

OnGet/OnGetAsync

初始化頁面狀態

OnPost/OnPostAsync

處理 POST 請求。

OnDelete/OnDeleteAsync

處理 DELETE 請求。

    例如在index頁面,實現post提交,示例如下:

    <form method="post"  >
        <input type="submit"  value="新增"
                class="btn btn-danger"
                asp-route-id="1"  />
    </form>
       [HttpPost]
        public async Task<IActionResult> OnPostAsync(int id)
        {
            await SaveAsync(id);
            //  RedirectToPageResult實現了IActionResult介面
            RedirectToPageResult result = RedirectToPage();
            return result;
        }

 

  5.2 預設的已命名處理程式方法

   由開發人員提供的處理程式方法,遵循的約定是: On<HTTP verb><handler name>[Async],  處理程式名稱出現在 Http 謂詞之後或者 Http 謂詞與 Async 之間。 例如,提交一個處理程式方法名為Message,那命名約定是OnPostMessage/OnPostMessageAsync。

      <form method="post">
        <input type="submit" value="消息提交"
               class="btn btn-danger"
               asp-route-id="1" asp-page-handler="Message" />
      </form>
        public async Task<IActionResult> OnPostMessageAsync(int id)
        {
            await SaveAsync(id);
            return RedirectToPage(); 
        }

    註意:OnPostMessageAsync上面不用加http謂詞。在頁面asp-page-handler必須指定後臺處理程式方法名。

 

  5.3 自定義處理程式方法名稱

    上面的處理程式方法都是需要按照預設約定,才能關聯起來。使用自定義處理程式可以讓用戶更改未命名和已命名的程式方法的命名方式。 假設:避免讓方法名稱以“On”開頭,並使用第一個分詞來確定 Http 謂詞,比如將DELETE、PUT 和 PATCH 的謂詞轉換為 POST。這樣程式可以提供下表所示的方法名稱。

處理程式方法

操作

Get

初始化頁面狀態

Post/PostAsync

處理 POST 請求

PostMessage/PostMessageAsync

POST 消息

DeleteMessage/DeleteMessageAsync

OST 消息以進行刪除

PutMessage/PutMessageAsync

POST 消息以進行放置

    若要建立此方案,請從 DefaultPageApplicationModelProvider 類繼承並重寫 CreateHandlerModel 方法,以提供自定義邏輯來解析 PageModel 處理程式名稱。 示例應用展示瞭如何在其 CustomPageApplicationModelProvider 類中執行此操作:

    當CustomPageApplicationModelProvider類繼承DefaultPageApplicationModelProvider想重寫處理程式方法名稱時,vs提示錯誤:DefaultPageApplicationModelProvider不可訪問,因為它具有一定保護級別。保護級別如下圖所示:

     在實際項目中,一般也不會自定義處理程式方法名稱,遵循既有的方法名約定都能滿足開發業務。這裡的實現以後在考慮吧。

 

   

參考文獻

官方資料:asp.net core routing

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、基本設置 1,應用註冊 若要把app應用顯示在後臺管理中,需要在admin.py中註冊。有兩種方式註冊 1.1 方式一: 1.2 方式二:用裝飾器 2,admin界面漢化 預設admin後臺管理界面是英文的,可以在settings.py中設置: LANGUAGE_CODE='zh-hans' T ...
  • 一 日誌級別: 二 預設級別為warning,預設列印到終端: 四 logging模塊的Formatter,Handler,Logger,Filter對象: 七 應用: ...
  • PETimer PETimer開源項目GitHub地址: "點擊跳轉" PETimer 1.雙端通用:基於C 語言實現的高效便捷計時器,可運行在伺服器(.net core/.net framework)以及Unity客戶端環境中。 2.功能豐富:PETimer支持幀數定時以及時間定時。定時任務可迴圈 ...
  • 在上一篇譯文——《深入理解C#——在C#中實現單例模式》中,對在C#中實現單例模式進行了詳細闡述。我們在日常的開發中可以採用解決方案4或解決方案6來實現單例模式,但每個單例類都需要單獨實現。 我們再來看看使用單例模式的一些場景: ...
  • EFCore使用JSON_VALUE查詢json對象的值 Intro SqlServer 從2016開始支持 JSON 操作,可以使用 JSON_VALUE 查詢 JSON 對象的某個屬性值, "更多介紹" ,現在公司的一些項目主要是使用 EF Core,手寫sql較少,針對比較簡單的 JSON_V ...
  • demo地址:https://github.com/PuzzledAlien/log4net_demo 準備 log4net 最新版本是2.0.8 VS2017 .Net Core 2.2 測試電腦配置 windows10 64位 4核CPU 16G記憶體 log4net官網引導文檔 :http:// ...
  • 根據我上篇文章的分享,我提到了FaceRecognitionDotNet,它是python語言開發的一個項目face_recognition移植。結果真是有喜有憂,喜的是很多去關註了,進行了下載,我看到項目Star從十幾個變成了現在將近兩百多個,憂的是很多人看不懂這項目,加了我的群來問怎麼用,或者缺 ...
  • 一般的datagridview控制項: this.dgvAssetList.CurrentCell = null;//取消datagridview行的編輯狀態 Dev gridcontrol控制項 GridControl的gridView的SelectionChanged事件 SelectionChan ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...