我在一些示例代码中看到,剃刀页面顶部的路由模板("{id:int}"
)导致指向该页面的链接使用另一种模式:
https://localhost/Movies/Edit/6
代替
https://localhost/Movies/Details?id=6
我的问题是asp.net如何管理到该模式的所有链接,在呈现该页面之前它是否知道该页面? 处理页面时,它是否可以与其他页面协作?
答案 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#
。此过程有很多名称,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页路由,那么将很难解析页面。