ASP.NET Core中的Razor頁(yè)面實(shí)現(xiàn)路由功能
在服務(wù)器端 Web 應(yīng)用程序框架中,其中非常重要的設(shè)計(jì)是開(kāi)發(fā)人員如何將URL與服務(wù)器上的資源進(jìn)行匹配,以便正確的處理請(qǐng)求。最簡(jiǎn)單的方法是將 URL 映射到磁盤(pán)上的物理文件,在 Razor 頁(yè)面框架中,ASP.NET團(tuán)隊(duì)就是這樣實(shí)現(xiàn)的。
關(guān)于 Razor 頁(yè)面框架如何將 URL 與文件相匹配,有一些規(guī)則您必須了解,以及如何根據(jù)需要自定義規(guī)則改變輸出的結(jié)果。如果您將 Razor 頁(yè)面與 Web Form 框架進(jìn)行比較,您還需要了解取代的 Ur l參數(shù)以及在URL中傳遞數(shù)據(jù)的機(jī)制。
規(guī)則一,Razor 頁(yè)面需要一個(gè)根目錄。默認(rèn)情況下,該根目錄是 Pages,位于Web應(yīng)用程序項(xiàng)目的根目錄中。您可以在Startup
類(lèi)的ConfigureServices
方法中配置其它文件夾作為根目錄。以下是將根目錄更改為位于應(yīng)用程序 “Content” 文件夾:
public void ConfigureServices(IServiceCollection services) { services .AddMvc(). AddRazorPagesOptions(options => { options.RootDirectory = "/Content"; }); }
規(guī)則二,URL映射到Razor頁(yè)面,URL不包含文件擴(kuò)展名。
規(guī)則三,“Index.cshtml”是一個(gè)默認(rèn)文檔,這意味著如果URL中缺少文件名,該請(qǐng)求將被映射到指定文件夾中的“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 |
在最后一個(gè)例子中,URL映射到兩個(gè)不同的文件 - 根目錄中的“account.cshtml”、“account”文件夾中的“index.cshtml”。Razor 頁(yè)面框架無(wú)法識(shí)別要選擇哪一個(gè)文件,因此如果您在應(yīng)用程序中實(shí)際同時(shí)擁有這兩個(gè)文件,那么如果您嘗試瀏覽www.domain.com/account
,會(huì)拋出如下異常:
AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
Page: /account/Index
Page: /account
URL傳遞參數(shù)
就像大多數(shù)其它框架一樣,參數(shù)可以作為查詢(xún)字符串在 URL 中傳遞,例如:www.domain.com/product?id=1
;或者,您可以將其作為路由參數(shù)傳遞,因此上述示例將變?yōu)?code>www.domain.com/product/1。URL的一部分必須映射到參數(shù)名稱(chēng),在頁(yè)面的路由模板來(lái)實(shí)現(xiàn)的,@page
指令的一部分:
@page "{id}"
該模板告訴框架將頁(yè)面名稱(chēng)之后URL的第一段作為“id”的路由參數(shù)。您可以通過(guò)多種方式訪(fǎng)問(wèn)路由參數(shù)的值。第一個(gè)是使用RouteData
字典:
@page "{id}" { var productId = RouteData.Values["id"]; }
或者,您可以向該頁(yè)面的OnGet()
方法添加與路由參數(shù)相同名稱(chēng)的參數(shù),并將其值分配給公共屬性:
@page "{id}" @{ @functions{ public int Id { get; set; } public void OnGet(int id) { Id = id; } } } <p>The Id is @Id</p>
如果您使用的是PageModel
,那么是這樣實(shí)現(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 文件內(nèi)容保持不變,但是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ù)的約束是它必須有一個(gè)值。URL www.domain.com/product/apple
與www.domain.com/product/21
一樣有效,都是可以與路由匹配。如果您希望id
值為整數(shù),則可以通過(guò)將數(shù)據(jù)類(lèi)型添加到模板來(lái)指定約束:
@page "{id:int}"
現(xiàn)在,如果您嘗試通過(guò)“apple”作為參數(shù)值,應(yīng)用程序?qū)⒎祷?04 Not Found狀態(tài)碼。
您可以指定值不是必需的,可以將參數(shù)設(shè)置為可為空類(lèi)型:
@page "{id:int?}"
如果您的應(yīng)用程序允許使用“apple”作為參數(shù)值,則可以指定只允許使用A-Z和a-z的字符:
@page "{id:alpha}"
您可以與最小長(zhǎng)度要求相結(jié)合:
@page "{id:alpha:minlength(4)}"
更多的約束信息,可以查看微軟文檔。
友好URL
友好的URL能夠?qū)?URL 映射到磁盤(pán)上的任意文件,打破根據(jù)文件名一對(duì)一的映射關(guān)系。您可以使用這個(gè)特性來(lái)不改變 URL 以進(jìn)行SEO優(yōu)化而不能重命名文件的問(wèn)題,例如,如果希望所有請(qǐng)求由一個(gè)文件進(jìn)行處理。友好 URL 在Startup
類(lèi)型的ConfigureServices
方法中配置,調(diào)用RazorPagesOption
類(lèi)的AddPageRoute
方法。以下示例將 URL www.domain.com/product
映射到Razor 頁(yè)面 “extras”文件夾“products.cshtml”文件:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/extras/products", "product"); }); }
如果您在 Web Forms 中使用過(guò)友好 URL,則應(yīng)注意AddPageRoute
方法的參數(shù)順序與 Web Forms MapPageRoute
方法相反,文件路徑作為第一個(gè)參數(shù)。此外,AddPageRoute
將路由模板作為第二參數(shù),而不是路由定義,其中任何約束被單獨(dú)定義。
最后一個(gè)例子說(shuō)明將所有請(qǐng)求映射到單個(gè)文件。如果站點(diǎn)內(nèi)容存儲(chǔ)在特定位置(數(shù)據(jù)庫(kù),Markdown文件),并且由單個(gè)文件(例如 “index.cshtml” )負(fù)責(zé)根據(jù) URL 定位內(nèi)容,然后將其處理為HTML,則可以執(zhí)行此操作:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/index", "{*url}"); }); }
路由模板(*)通配符表示“全部”。即使使用此配置,磁盤(pán)上的現(xiàn)有文件和URL之間的匹配規(guī)則仍然正常運(yùn)行。
總結(jié)
Razor 頁(yè)面中的路由系統(tǒng)非常直觀,基于文件位置,但如果需要覆蓋默認(rèn)約定,它也非常強(qiáng)大,可配置。
到此這篇關(guān)于ASP.NET Core中Razor頁(yè)面實(shí)現(xiàn)路由功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解ASP.NET WEB API 之屬性路由
- ASP.NET?Core?MVC路由(Routing)的用法
- ASP.NET?Core使用功能開(kāi)關(guān)控制路由訪(fǎng)問(wèn)操作(續(xù))
- ASP.NET?Core使用功能開(kāi)關(guān)控制路由訪(fǎng)問(wèn)操作
- Asp.net Core 如何設(shè)置黑白名單(路由限制)
- 詳解ASP.NET Core端點(diǎn)路由的作用原理
- ASP.NET Core中自定義路由約束的實(shí)現(xiàn)
- asp.net core webapi項(xiàng)目配置全局路由的方法示例
- asp.net core 屬性路由和約定路由的實(shí)現(xiàn)
相關(guān)文章
google suggest 下拉菜單實(shí)現(xiàn)代碼(asp.net版本)
原來(lái)發(fā)表過(guò),是asp版本的,但是不支持上下鍵,現(xiàn)在后臺(tái)處理程序用.net寫(xiě)的。代碼進(jìn)行部分優(yōu)化。2009-07-07MVC實(shí)現(xiàn)下拉框聯(lián)動(dòng)效果(單選)
這篇文章主要為大家詳細(xì)介紹了MVC實(shí)現(xiàn)下拉框聯(lián)動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06ASP.NET Core Api網(wǎng)關(guān)Ocelot的使用初探
這篇文章主要介紹了ASP.NET Core Api網(wǎng)關(guān)Ocelot的使用初探,幫助大家更好的理解和學(xué)習(xí)使用.NET技術(shù),感興趣的朋友可以了解下2021-03-03ASP.NET GridView中加入RadioButton不能單選的解決方案
這篇文章主要介紹了ASP.NET GridView中加入RadioButton不能單選的解決方案,希望大家閱讀完本文有所收獲。2015-09-09asp.net ajaxControlToolkit FilteredTextBoxExtender的簡(jiǎn)單用法
最近寫(xiě)的東西驗(yàn)證比較多,尤其是數(shù)字驗(yàn)證,無(wú)意中發(fā)現(xiàn)這個(gè)控件,有點(diǎn)兒意思。記錄一下2008-11-11ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu)(五)
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08ASP.NET 清除模式窗口數(shù)據(jù)緩存的操作方式
模式窗口showModalDialog()彈出頁(yè)面在asp.net中經(jīng)常用到,接下來(lái)為大家介紹下清除模式窗口緩存數(shù)據(jù)的問(wèn)題2013-04-04教你使用.NET快速比較兩個(gè)byte數(shù)組是否相等
在.NET中如何快速的比較兩個(gè)byte數(shù)組是否完全相等,聽(tīng)起來(lái)是一個(gè)比較兩個(gè)byte數(shù)組是完全相等是一個(gè)簡(jiǎn)單的問(wèn)題,但是深入研究以后,覺(jué)得還是有很多方案的,這里和大家一起分享下2022-04-04在.NET程序崩潰時(shí)自動(dòng)創(chuàng)建Dump的思路詳解
本文主要是介紹了如何在dotNet程序崩潰時(shí)自動(dòng)創(chuàng)建Dump,Windows上的方法對(duì)于.NET Freamwork和.NET Core版本都適用,.NET Core全平臺(tái)版本的話(huà)需要注意環(huán)境變量支持的.NET版本,對(duì).net程序崩潰自動(dòng)創(chuàng)建Dump相關(guān)知識(shí)感興趣的朋友一起看看吧2022-11-11ASP.NET MVC 項(xiàng)目直接預(yù)覽PDF文件
本文主要介紹了ASP.NET MVC項(xiàng)目實(shí)現(xiàn)直接預(yù)覽PDF文件的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02