ASP.NET Core Razor 頁面路由

来源:http://www.cnblogs.com/tdfblog/archive/2017/09/04/razor-pages-route-in-asp-net-core.html
-Advertisement-
Play Games

在伺服器端 Web 應用程式框架中,其中非常重要的設計是開發人員如何將URL與伺服器上的資源進行匹配,以便正確的處理請求。最簡單的方法是將 URL 映射到磁碟上的物理文件,在 Razor 頁面框架中,ASP.NET團隊就是這樣實現的。 關於 Razor 頁面框架如何將 URL 與文件相匹配,有一些規 ...


在伺服器端 Web 應用程式框架中,其中非常重要的設計是開發人員如何將URL與伺服器上的資源進行匹配,以便正確的處理請求。最簡單的方法是將 URL 映射到磁碟上的物理文件,在 Razor 頁面框架中,ASP.NET團隊就是這樣實現的。

關於 Razor 頁面框架如何將 URL 與文件相匹配,有一些規則您必須瞭解,以及如何根據需要自定義規則改變輸出的結果。如果您將 Razor 頁面與 Web Form 框架進行比較,您還需要瞭解取代的 Ur l參數以及在URL中傳遞數據的機制。

規則一,Razor 頁面需要一個根目錄。預設情況下,該根目錄是 Pages,位於Web應用程式項目的根目錄中。您可以在Startup類的ConfigureServices方法中配置其它文件夾作為根目錄。以下是將根目錄更改為位於應用程式 “Content” 文件夾:

    public void ConfigureServices(IServiceCollection services)
    { 
        services 
            .AddMvc(). 
            AddRazorPagesOptions(options => { 
                options.RootDirectory = "/Content";
         }); 
    }

規則二,URL映射到Razor頁面,URL不包含文件擴展名。

規則三,“Index.cshtml”是一個預設文檔,這意味著如果URL中缺少文件名,該請求將被映射到指定文件夾中的“Index.cshtml”。以下是一些URL如何映射到文件路徑的示例:

URL 映射文件
www.domain.com /Pages/Index.cshtml
www.domain.com/index /Pages/Index.cshtml
www.domain.com/index /Pages/Index.cshtml
www.domain.com/account /Pages/account.cshtml 或者 /Pages/account/index.cshtml

在最後一個例子中,URL映射到兩個不同的文件 - 根目錄中的“account.cshtml”、“account”文件夾中的“index.cshtml”。Razor 頁面框架無法識別要選擇哪一個文件,因此如果您在應用程式中實際同時擁有這兩個文件,那麼如果您嘗試瀏覽www.domain.com/account,會拋出如下異常:

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

Page: /account/Index

Page: /account

URL傳遞參數

就像大多數其它框架一樣,參數可以作為查詢字元串在 URL 中傳遞,例如:www.domain.com/product?id=1;或者,您可以將其作為路由參數傳遞,因此上述示例將變為www.domain.com/product/1。URL的一部分必須映射到參數名稱,在頁面的路由模板來實現的,@page指令的一部分:

@page "{id}"

該模板告訴框架將頁面名稱之後URL的第一段作為“id”的路由參數。您可以通過多種方式訪問路由參數的值。第一個是使用RouteData字典:

@page "{id}"
{
    var productId = RouteData.Values["id"];
}

或者,您可以向該頁面的OnGet()方法添加與路由參數相同名稱的參數,並將其值分配給公共屬性:

@page "{id}"
@{
    @functions{

        public int Id { get; set; }

        public void OnGet(int id)
        {
            Id = id;
        }
    }
}
<p>The Id is @Id</p>

如果您使用的是PageModel,那麼是這樣實現的:

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPages.Pages
{
    public class ProductModel : PageModel
    {
        public int Id { get; set; }
        public void OnGet(int id)
        {
            Id = id;
        }
    }
}
@page "{id}"
@model  ProductModel
<p>The Id is @Model.Id</p>

最後,您可以在公有屬性使用BindProperty特性,並省略該OnGet方法中的參數。Razor 文件內容保持不變,但是PageModel代碼略有更改:

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPages.Pages
{
    public class ProductModel : PageModel
    {
        [BindProperty(SupportsGet = true)]
        public int Id { get; set; }
        public void OnGet()
        {
        }
    }
}

約束

此外,在此示例中參數的約束是它必須有一個值。URL www.domain.com/product/applewww.domain.com/product/21一樣有效,都是可以與路由匹配。如果您希望id值為整數,則可以通過將數據類型添加到模板來指定約束:

@page "{id:int}"

現在,如果您嘗試通過“apple”作為參數值,應用程式將返回404 Not Found狀態碼。

您可以指定值不是必需的,可以將參數設置為可為空類型:

@page "{id:int?}"

如果您的應用程式允許使用“apple”作為參數值,則可以指定只允許使用A-Z和a-z的字元:

@page "{id:alpha}"

您可以與最小長度要求相結合:

@page "{id:alpha:minlength(4)}"

更多的約束信息,可以查看微軟文檔

友好URL

友好的URL能夠將 URL 映射到磁碟上的任意文件,打破根據文件名一對一的映射關係。您可以使用這個特性來不改變 URL 以進行SEO優化而不能重命名文件的問題,例如,如果希望所有請求由一個文件進行處理。友好 URL 在Startup類型的ConfigureServices方法中配置,調用RazorPagesOption類的AddPageRoute方法。以下示例將 URL www.domain.com/product 映射到Razor 頁面 “extras”文件夾“products.cshtml”文件:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/extras/products", "product");
            });
    }

如果您在 Web Forms 中使用過友好 URL,則應註意AddPageRoute方法的參數順序與 Web Forms MapPageRoute方法相反,文件路徑作為第一個參數。此外,AddPageRoute將路由模板作為第二參數,而不是路由定義,其中任何約束被單獨定義。

最後一個例子說明將所有請求映射到單個文件。如果站點內容存儲在特定位置(資料庫,Markdown文件),並且由單個文件(例如 “index.cshtml” )負責根據 URL 定位內容,然後將其處理為HTML,則可以執行此操作:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc()
            .AddRazorPagesOptions(options => {
                 options.Conventions.AddPageRoute("/index", "{*url}");
        });
    }

路由模板(*)通配符表示“全部”。即使使用此配置,磁碟上的現有文件和URL之間的匹配規則仍然正常運行。

總結

Razor 頁面中的路由系統非常直觀,基於文件位置,但如果需要覆蓋預設約定,它也非常強大,可配置。

原文:《Routing in Razor Pages》https://www.mikesdotnetting.com/article/310/routing-in-razor-pages
翻譯:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/razor-pages-route-in-asp-net-core.html
歡迎轉載,請在明顯位置給出出處及鏈接。


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

-Advertisement-
Play Games
更多相關文章
  • 一、兩個腳本代碼 Dockerfile hello_world.sh 二、打包成鏡像 1、 這裡要註意,打包指令需要在Dockerfile、hello_world.sh下進行,指令後面最後一個“.”,這叫上下文路徑。 2、查看鏡像文件列表,看看是否成功 三、保存成tar.gz格式並檢查當前目錄下包是 ...
  • 其實關於這方面的知識,我閱讀的是《UNIX網路編程:捲一》,書里是以UNIX為中心展開描述的,根據這部分知識,在網上參考了部分資料。以Linux為中心整理了這篇博客。 Linux的I/O模型 和Unix的I/O模型基本一致,Linux下一共有5種I/O模型[1] 阻塞式I/O模型; 非阻塞式I/O模 ...
  • 本文是經驗帖,以後遇到類似的情況會持續更新到這篇文章 普通用戶使用sudo會遇到一下情況 1.無法寫入 /var/log/messages /var/log/secure 2.無法使用字元重定向在 /etc/security/limit.d 目錄下新建文件 3.無法將字元流重定向到 /etc/gru ...
  • SELinux是美國國家安全局(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。但是SELinux的並不能與眾多服務很好的相容,有些人會關閉SELinux一了百了。在日常的運維過程中很少去頻繁的開啟關閉SElinux,今天我就寫一個關閉與開啟SELinux的腳本來鍛煉我的腳 ...
  • 話不多說, 直接上教程. 首先備份/etc/yum.repos.d/CentOS Base.repo 下載對應版本repo文件, 放入/etc/yum.repos.d/(操作前請做好相應備份) 運行以下命令生成緩存 參考: "CentOS鏡像使用幫助" ...
  • 用apt-get安裝軟體時提示: 無法獲得鎖 /var/lib/dpkg/lock - open(11:資源暫時不可用) 無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它? 其實報錯已經給了提示了,就是有進程正在占用apt-get命令,So... 命令跑起來,找出這個進程,k ...
  • 一、OpenTSDB簡介 開源監控系統OpenTSDB,用hbase存儲所有的時序(無須 採樣)來構建一個分散式、可伸縮的時間序列資料庫。它支持秒級數據採集所有metrics,支持永久存儲,可以做容量規劃,並很容易的接入到現有的報警系 統里。OpenTSDB可以從大規模的集群(包括集群中的網路設備、 ...
  • linux打包壓縮和解壓縮命令大全 linux壓縮和解壓縮命令大全 tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...