如何使用Razor页面在.NET Core 2.1应用程序中使用子区域配置路由?

时间:2019-03-12 01:16:29

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

我有一个使用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中的索引文件。我的首选是基于约定的路由,这样我就不必将整个应用程序移植到使用控制器。

到目前为止,我已经尝试了几种无法达到预期效果的方法:

  1. Attribute based routing using sub area attributes and a ViewLocationExpander
    • 此方法在很大程度上依赖于属性路由,并且具有控制器来处理应用程序的后端,而现有的应用程序不使用控制器,因为Razor Pages(OnGetAsync()OnPostAsync()等)提供的处理程序方法已足够。
      • 我尝试使用上述链接文章中的路由和SubAreaViewLocationExpander的混合方法,但发现如果文件不存在(即后备部分不起作用),我将无法获得有效的路由。我将其归因于ViewLocationExpander仅作用于顶部带有@page指令的文件(不知道这是多么真实,但这是我的本地测试似乎表明的事实)。
  2. Convention based routing using a custom IRouter
    • 这种方法似乎更像我想要的,除了在路由/文件存在的情况下,context.HttpContext.Request.Path.Value将返回诸如site.manifest之类的值,而不是实际的路由。当路由/文件不存在时,它将返回提供的路由(baseUrl/student/studentOrganisationTwo/Index),但是如上链接所示,我无法使重定向工作。即使在创建了必需的控制器并设置了context.RouteData.Values["controller"]context.RouteData.Values["action"]之后,重定向仍然无法进行。
      • 我也找不到任何有关设置context.RouteData.Values键的有效值的文档。

我很乐意在任何方面提供代码示例或说明。

0 个答案:

没有答案