在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求。最简单的方法是将 URL 映射到磁盘上的物理文件,在 Razor 页面框架中,ASP.NET团队就是这样实现的。 关于 Razor 页面框架如何将 URL 与文件相匹配,有一些规则您必须了解,以及如何根据需要自定义规则改变输出的结果。如果您将 Razor 页面与 Web Form 框架进行比较,您还需要了解取代的 Ur l参数以及在URL中传递数据的机制。 规则一,Razor 页面需要一个根目录。默认情况下,该根目录是 Pages,位于Web应用程序项目的根目录中。您可以在 public void ConfigureServices(IServiceCollection services) { services .AddMvc(). AddRazorPagesOptions(options => { options.RootDirectory = "/Content"; }); } 规则二,URL映射到Razor页面,URL不包含文件扩展名。 规则三,“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 中传递,例如: @page "{id}" 该模板告诉框架将页面名称之后URL的第一段作为“id”的路由参数。您可以通过多种方式访问路由参数的值。第一个是使用 @page "{id}" { var productId = RouteData.Values["id"]; } 或者,您可以向该页面的 @page "{id}" @{ @functions{ public int Id { get; set; } public void OnGet(int id) { Id = id; } } } <p>The Id is @Id</p> 如果您使用的是 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> 最后,您可以在公有属性使用 using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPages.Pages { public class ProductModel : PageModel { [BindProperty(SupportsGet = true)] public int Id { get; set; } public void OnGet() { } } } 约束 此外,在此示例中参数的约束是它必须有一个值。 @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 在 public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/extras/products", "product"); }); } 如果您在 Web Forms 中使用过友好 URL,则应注意 最后一个例子说明将所有请求映射到单个文件。如果站点内容存储在特定位置(数据库,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 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
请发表评论