【问题标题】:ASP.Net Core route template behaviourASP.Net Core 路由模板行为
【发布时间】:2019-08-10 13:01:55
【问题描述】:

我在一些示例代码中看到,剃须刀页面顶部的路由模板 ("{id:int}") 导致指向该页面的链接使用另一种模式:

https://localhost/Movies/Edit/6

而不是

https://localhost/Movies/Details?id=6

我的问题是 asp.net 如何设法更改指向该模式的所有链接,它在呈现之前是否知道该页面? 处理页面时是否与其他页面协作?

【问题讨论】:

  • 生成 url 检查操作的 Route 属性以完成您所描述的帮助程序。但是你为什么要问这个?

标签: asp.net-core razor-pages asp.net-core-routing


【解决方案1】:

当应用程序第一次启动时,会构建一组属性路由。路由是为根 Pages 文件夹中带有 @page 指令的任何 Razor 文件以及任何 other routes that have been defined via PageRouteConventions 构建的。

当您使用 Url 帮助器或锚标记帮助器(在幕后使用 Url 帮助器)生成链接时,生成的链接基于为您传递到的页面构建的属性路由帮手。

在属性路由中,路由参数作为段添加到 URL 中,这就是为什么这些值不作为查询字符串值附加的原因。如果您更喜欢查询字符串,请不要将路由值声明为 @page 指令的一部分。

【讨论】:

    【解决方案2】:

    运行dotnet publish -c Release 命令并查看bin/Release 文件夹内部。

    您将找不到包含 html 的 .cshtml 文件。所有的html都去哪里了?这与问题有何关系?

    您必须记住,cshtml 最终将成为您的常规 c#,而所有花哨的剃刀模板语法最终都将成为 c#。这个过程有很多名字,transpilation 是其中之一,由transpilers 执行。

    好吧,现在我们可以放心地假设当您有一个Index.cshtml 文件时,它将被填充到某种对象中,我们称之为RazorPage.cs 这将只存储此页面的所有配置。现在假设这个索引页面位于一个名为Home 的文件夹中,现在我们可以有一个字典Dictionary<string, RazorPage>,假设key 将是"/Home/Index"。根据转译的@page "{id:int}" 语法,它可能会为路由生成一个模板字符串,并将其存储在RazorPage 中的RouteTemplate 参数中。

    因此,当您使用asp-page 标签助手时,它会找到正确的RazorPage,并且它可以知道url 的模板,并使用您提供的值填充它。

    我还没有看到实际的实现,这只是我的猜测。

    我的问题是 asp.net 如何设法更改指向该模式的所有链接,它在呈现之前是否知道该页面?

    是的,它在运行时了解有关页面的所有信息。 services.AddMvc() 服务很可能会在启动时负责加载所有剃须刀页面/视图/控制器。

    在处理一个页面时是否与其他页面协作?

    很可能不是,除非您指的是组件/布局/部分。但是,如果您有 2 个页面的相同路径,则很难解析一个页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2016-10-22
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2018-12-19
      相关资源
      最近更新 更多