ASP.NET Core Razor 頁面路由詳解
在服務器端 Web 應用程序框架中,其中非常重要的設計是開發(fā)人員如何將URL與服務器上的資源進行匹配,以便正確的處理請求。最簡單的方法是將 URL 映射到磁盤上的物理文件,在 Razor 頁面框架中,ASP.NET團隊就是這樣實現(xiàn)的。
關于 Razor 頁面框架如何將 URL 與文件相匹配,有一些規(guī)則您必須了解,以及如何根據(jù)需要自定義規(guī)則改變輸出的結果。如果您將 Razor 頁面與 Web Form 框架進行比較,您還需要了解取代的 Ur l參數(shù)以及在URL中傳遞數(shù)據(jù)的機制。
規(guī)則一,Razor 頁面需要一個根目錄。默認情況下,該根目錄是 Pages,位于Web應用程序項目的根目錄中。您可以在Startup類的ConfigureServices方法中配置其它文件夾作為根目錄。以下是將根目錄更改為位于應用程序 “Content” 文件夾:
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvc().
AddRazorPagesOptions(options => {
options.RootDirectory = "/Content";
});
}
規(guī)則二,URL映射到Razor頁面,URL不包含文件擴展名。
規(guī)則三,“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傳遞參數(shù)
就像大多數(shù)其它框架一樣,參數(shù)可以作為查詢字符串在 URL 中傳遞,例如:www.domain.com/product?id=1;或者,您可以將其作為路由參數(shù)傳遞,因此上述示例將變?yōu)?code>www.domain.com/product/1。URL的一部分必須映射到參數(shù)名稱,在頁面的路由模板來實現(xiàn)的,@page指令的一部分:
@page "{id}"
該模板告訴框架將頁面名稱之后URL的第一段作為“id”的路由參數(shù)。您可以通過多種方式訪問路由參數(shù)的值。第一個是使用RouteData字典:
@page "{id}"
{
var productId = RouteData.Values["id"];
}
或者,您可以向該頁面的OnGet()方法添加與路由參數(shù)相同名稱的參數(shù),并將其值分配給公共屬性:
@page "{id}"
@{
@functions{
public int Id { get; set; }
public void OnGet(int id)
{
Id = id;
}
}
}
<p>The Id is @Id</p>
如果您使用的是PageModel,那么是這樣實現(xiàn)的:
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方法中的參數(shù)。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()
{
}
}
}
約束
此外,在此示例中參數(shù)的約束是它必須有一個值。URL www.domain.com/product/apple與www.domain.com/product/21一樣有效,都是可以與路由匹配。如果您希望id值為整數(shù),則可以通過將數(shù)據(jù)類型添加到模板來指定約束:
@page "{id:int}"
現(xiàn)在,如果您嘗試通過“apple”作為參數(shù)值,應用程序將返回404 Not Found狀態(tài)碼。
您可以指定值不是必需的,可以將參數(shù)設置為可為空類型:
@page "{id:int?}"
如果您的應用程序允許使用“apple”作為參數(shù)值,則可以指定只允許使用A-Z和a-z的字符:
@page "{id:alpha}"
您可以與最小長度要求相結合:
@page "{id:alpha:minlength(4)}"
更多的約束信息,可以查看微軟文檔。
友好URL
友好的URL能夠將 URL 映射到磁盤上的任意文件,打破根據(jù)文件名一對一的映射關系。您可以使用這個特性來不改變 URL 以進行SEO優(yōu)化而不能重命名文件的問題,例如,如果希望所有請求由一個文件進行處理。友好 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方法的參數(shù)順序與 Web Forms MapPageRoute方法相反,文件路徑作為第一個參數(shù)。此外,AddPageRoute將路由模板作為第二參數(shù),而不是路由定義,其中任何約束被單獨定義。
最后一個例子說明將所有請求映射到單個文件。如果站點內容存儲在特定位置(數(shù)據(jù)庫,Markdown文件),并且由單個文件(例如 “index.cshtml” )負責根據(jù) URL 定位內容,然后將其處理為HTML,則可以執(zhí)行此操作:
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvc()
.AddRazorPagesOptions(options => {
options.Conventions.AddPageRoute("/index", "{*url}");
});
}
路由模板(*)通配符表示“全部”。即使使用此配置,磁盤上的現(xiàn)有文件和URL之間的匹配規(guī)則仍然正常運行。
總結
Razor 頁面中的路由系統(tǒng)非常直觀,基于文件位置,但如果需要覆蓋默認約定,它也非常強大,可配置。
原文:《Routing in Razor Pages》https://www.mikesdotnetting.com/article/310/routing-in-razor-pages
翻譯:Sweet Tang
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
asp.net服務器端指令include的使用及優(yōu)勢介紹
將指定文件的內容插入 ASP.NET 文件中,包括網(wǎng)頁(.aspx 文件)、用戶控件文件(.ascx 文件)和 Global.asax 文件2013-04-04
HTTP錯誤500.19解決方法(定義了重復的節(jié)點)
HTTP 錯誤 500.19 - Internal Server Error 無法訪問請求的頁面,因為該頁的相關配置數(shù)據(jù)無效2013-06-06
asp.net sql 數(shù)據(jù)庫處理函數(shù)命令
asp.net sql 數(shù)據(jù)庫處理函數(shù)命令 ,需要的朋友可以參考下。2009-10-10
Asp.net中處理一個站點不同Web應用共享Session的問題
Asp.net中處理一個站點不同Web應用共享Session的問題...2006-09-09
.Net 下區(qū)別使用 ByRef/ByVal 的重要性 分享
這篇文章介紹了.Net 下區(qū)別使用 ByRef/ByVal 的重要性,有需要的朋友可以參考一下2013-07-07
.NET 6實現(xiàn)基于JWT的Identity功能方法詳解
在.NET Web API開發(fā)中還有一個很重要的需求是關于身份認證和授權的。本文將介紹使用.NET框架自帶的認證和授權中間件去實現(xiàn)基于JWT的身份認證和授權功能的方法詳解,需要的可以參考一下2022-01-01

