網站首頁 編程語言 正文
在服務器端 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; } } }The Id is @Id
如果您使用的是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 ProductModelThe Id is @Model.Id
最后,您可以在公有屬性使用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/apple
與www.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 頁面中的路由系統非常直觀,基于文件位置,但如果需要覆蓋默認約定,它也非常強大,可配置。
原文鏈接:https://www.cnblogs.com/tdfblog/p/razor-pages-route-in-asp-net-core.html
相關推薦
- 2022-04-16 C語言鏈表與單鏈表詳解_C 語言
- 2021-11-28 C#?通過同步和異步實現優化做早餐的時間_C#教程
- 2022-12-04 Jetpack之CameraX的使用_Android
- 2022-10-14 laravel 中關于模型查詢構造器的特殊用法
- 2022-05-19 Python?常用內置模塊超詳細梳理總結_python
- 2022-07-10 初識form表單中的兩種提交方式
- 2022-12-28 Django初步使用Celery處理耗時任務和定時任務問題_python
- 2022-11-19 Golang接口使用教程詳解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支