Detailed explanation of ASP. NET Core Razor page routing, corerazor
In the server-side Web application framework, a very important design is how developers can match URLs with resources on the server to process requests correctly. The simplest method is to map URLs to physical files on the disk. In the Razor page framework, the ASP. NET team implements this.
For more information about how the Razor page framework matches URLs with files, see some rules and how to customize rules to change output results as needed. If you compare the Razor page with the Web Form framework, you also need to understand the replaced Ur l parameter and the mechanism for passing data in the URL.
Rule 1: The Razor page requires a root directory. By default, the root directory is Pages, which is located in the root directory of the Web application project. You canStartup
ClassConfigureServices
To configure other folders as the root directory. Change the root directory to the "Content" folder of the application:
public void ConfigureServices(IServiceCollection services) { services .AddMvc(). AddRazorPagesOptions(options => { options.RootDirectory = "/Content"; }); }
Rule 2: The URL is mapped to the Razor page, and the URL does not contain the file extension.
Rule 3: "Index. cshtml" is a default document, which means that if
URL |
Ing File |
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 or/Pages/account/index. cshtml |
In the last example, the URL is mapped to two different files-"index. cshtml" in the "account. cshtml" and "account" folders in the root directory ". The Razor page framework cannot identify which file to select. Therefore, if you actually own both files in the application, if you attempt to browse www.domain.com/account, the following exception will be thrown:
AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
Page:/account/Index
Page:/account
URL Transfer Parameters
Like most other frameworks, parameters can be passed as query strings in URLs. For example:www.domain.com/product?id=1
Or, you can pass it as a route parameter, so the above example will becomewww.domain.com/product/1
. A part of the URL must be mapped to the parameter name.,@page
Part of the command:
@page "{id}"
This template tells the framework to use the first segment of the URL after the Page name as the routing parameter of "id. You can access the value of Route parameters in multiple ways. The first is to useRouteData
Dictionary:
@page "{id}"{ var productId = RouteData.Values["id"];}
Alternatively, you canOnGet()
Method to add a parameter with the same name as the routing parameter and assign its value to the public attribute:
@page "{id}"@{ @functions{ public int Id { get; set; } public void OnGet(int id) { Id = id; } }}<p>The Id is @Id</p>
If you are usingPageModel
Is implemented as follows:
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>
Finally, you can useBindProperty
Feature, and omit thisOnGet
Parameters in the method. The content of the Razor file remains unchanged,PageModel
Code slightly changed:
using Microsoft.AspNetCore.Mvc.RazorPages;namespace RazorPages.Pages{ public class ProductModel : PageModel { [BindProperty(SupportsGet = true)] public int Id { get; set; } public void OnGet() { } }}
Constraints
In this example, the parameter constraint is that it must have a value.URL www.domain.com/product/apple
Andwww.domain.com/product/21
It is equally valid and can be matched with the route. If you wantid
If the value is an integer, you can specify the constraints by adding the data type to the template:
@page "{id:int}"
Now, if you try to use "apple" as the parameter value, the application will return the 404 Not Found status code.
You can specify a value that is not required. You can set the parameter type to NULL:
@page "{id:int?}"
If your application allows the use of apple as a parameter value, you can specify characters that only allow the use of A-Z and a-z:
@page "{id:alpha}"
You can combine with the minimum length requirement:
@page "{id:alpha:minlength(4)}"
For more constraints, see the Microsoft documentation.
Friendly URL
A friendly URL maps a URL to any file on the disk, breaking the one-to-one ing relationship based on the file name. You can use this feature to not change the URL for SEO optimization but not rename the file. For example, if you want all requests to be processed by one file. Friendly URL inStartup
TypeConfigureServices
Method Configuration, callRazorPagesOption
ClassAddPageRoute
Method. In the following examplewww.domain.com/product
Map to the "products. cshtml" file in the "extras" folder on the Razor page:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/extras/products", "product"); }); }
If you have used a friendly URL in Web Forms, note thatAddPageRoute
Method Parameter order and Web FormsMapPageRoute
On the contrary, the file path is the first parameter. In addition,AddPageRoute
The routing template is used as the second parameter rather than the routing definition, and any constraints are defined separately.
The last example illustrates how to map all requests to a single file. If the site content is stored in a specific location (Database, Markdown file), and a single file (such as "index. cshtml) is used to locate the content based on the URL and process the content as HTML. You can perform this operation:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/index", "{*url}"); }); }
The wildcard character "all" in the routing template ". Even with this configuration, the matching rules between existing files and URLs on the disk still run normally.
Summary
The routing system on the Razor page is intuitive and based on the file location. However, if you need to override the default conventions, it is also very powerful and configurable.
Routing in Razor Pages https://www.mikesdotnetting.com/article/310/routing-in-razor-pages
Translation: Sweet Tang
The above is all the content of this article. I hope it will be helpful for your learning and support for helping customers.