ASP.Net Core Razor 页面路由
在服務器端 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如何映射到文件路徑的示例:
| 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字典:
"{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/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 頁面中的路由系統非常直觀,基于文件位置,但如果需要覆蓋默認約定,它也非常強大,可配置。
原文:《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
相關文章:?
.NET Core 2.0 正式發布信息匯總
.NET Standard 2.0 特性介紹和使用指南
.NET Core 2.0 的dll實時更新、https、依賴包變更問題及解決
.NET Core 2.0 特性介紹和使用指南
Entity Framework Core 2.0 新特性
體驗 PHP under .NET Core
.NET Core 2.0使用NLog
升級項目到.NET Core 2.0,在Linux上安裝Docker,并成功部署
解決Visual Studio For Mac Restore失敗的問題
ASP.NET Core 2.0 特性介紹和使用指南
.Net Core下通過Proxy 模式 使用 WCF
.NET Core 2.0 開源Office組件 NPOI
ASP.NET Core Razor頁面 vs MVC
Razor Page–Asp.Net Core 2.0新功能 ?Razor Page介紹
MySql 使用 EF Core 2.0 CodeFirst、DbFirst、數據庫遷移(Migration)介紹及示例
.NET Core 2.0遷移技巧之web.config配置文件
asp.net core MVC 過濾器之ExceptionFilter過濾器(一)
ASP.NET Core 使用Cookie驗證身份
ASP.NET Core MVC – Tag Helpers 介紹
ASP.NET Core MVC – Caching Tag Helpers
ASP.NET Core MVC – Form Tag Helpers
ASP.NET Core MVC – 自定義 Tag Helpers
ASP.NET Core MVC – Tag Helper 組件
原文地址:http://www.cnblogs.com/tdfblog/p/razor-pages-route-in-asp-net-core.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的ASP.Net Core Razor 页面路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 运行原理解剖[
- 下一篇: [北京微软技术直通车]前端 Visual