我有一个使用Razor页面的现有ASP.NET Core 2.1 Web应用程序。从前端的角度来看,需要扩展应用程序的目标受众以服务于互斥的组。相同的后端,不同的前端。
要提供以下结果的概述,请参见所需的最终状态以及一些示例路线:
Areas
Student // baseUrl/student (uses Index file from Student/Pages)
Pages
Index.cshtml
Contact.cshtml
StudentOrganisationOne // baseUrl/student/studentOrganisationOne (uses Index file from Student/StudentOrganisationOne/Pages)
Pages
Index.cshtml // This Index page would override the one in Student/Pages
StudentOrganisationTwo // baseUrl/student/studentOrganisationTwo (uses Index file from Student/Pages as it doesn't have its own)
Pages
Contact.cshtml // This Contact page would override the one in Student/Pages
StudentOrganisationThree
... // This organisation has no custom pages provided so would fall back to using those in Student/Pages
Business
BusinessOrganisationOne // Same behaviour as in the Student scenario
...
BusinessOrganisationTwo
...
简而言之,我想要的(我什至不确定是否可能/是否受支持)是,如果路由不存在,则路由引擎将尝试上一级进行文件匹配。因此,以上面的示例为例,如果我请求baseUrl/student/studentOrganisationTwo
,它将回退Student/Pages
中的索引文件。我的首选是基于约定的路由,这样我就不必将整个应用程序移植到使用控制器。
到目前为止,我已经尝试了几种无法达到预期效果的方法:
OnGetAsync()
,OnPostAsync()
等)提供的处理程序方法已足够。
SubAreaViewLocationExpander
的混合方法,但发现如果文件不存在(即后备部分不起作用),我将无法获得有效的路由。我将其归因于ViewLocationExpander仅作用于顶部带有@page
指令的文件(不知道这是多么真实,但这是我的本地测试似乎表明的事实)。context.HttpContext.Request.Path.Value
将返回诸如site.manifest
之类的值,而不是实际的路由。当路由/文件不存在时,它将返回提供的路由(baseUrl/student/studentOrganisationTwo/Index
),但是如上链接所示,我无法使重定向工作。即使在创建了必需的控制器并设置了context.RouteData.Values["controller"]
和context.RouteData.Values["action"]
之后,重定向仍然无法进行。
context.RouteData.Values
键的有效值的文档。我很乐意在任何方面提供代码示例或说明。