ASP.Net Core路由模板行为

时间:2019-08-10 13:01:55

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

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

https://localhost/Movies/Edit/6

代替

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

我的问题是asp.net如何管理到该模式的所有链接,在呈现该页面之前它是否知道该页面? 处理页面时,它是否可以与其他页面协作?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

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

您将找不到包含HTML的.cshtml文件。什么发生在所有html上?这与问题有什么关系?

您必须记住cshtml最终将成为您的普通c#,所有花哨的剃刀模板语法最终都将变为c#。此过程有很多名称,transpilationtranspilers执行的名称之一。

好吧,现在我们可以安全地假设,当您拥有一个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页路由,那么将很难解析页面。