ASP.NET Core Razor頁面路由的詳細介紹

來源:互聯網
上載者:User
這篇文章主要介紹了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 對應檔
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 頁面中的路由系統非常直觀,基於檔案位置,但如果需要覆蓋預設約定,它也非常強大,可配置。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.