从VS 2013迁移到VS 2017 MVC路由问题

时间:2017-06-22 14:23:07

标签: c# asp.net asp.net-mvc visual-studio-2017

我目前有2个MVC网站,这两个网站最初都是在.NET Framework 4.5版的Visual Studio 2013中构建为ASP.NET表单应用程序。他们后来迁移到Visual Studio 2013中的MVC平台,而没有更改框架版本。我们目前正在尝试将这两个项目升级到最新版本的.NET(4.6),并切换到Visual Studio 2017,以便开发,测试和部署这两个应用程序。

将项目转换为VS2017遇到了一个问题,这个问题似乎源于对VS2017发布实现的ASP.NET MVC框架的根本性改变。问题出现在我们的一个应用程序中,该应用程序在其路由方案中使用2个单独的MVC区域。在大多数情况下,我们不使用使用新MVC项目模板创建的控制器,模型和视图的自动生成文件夹。相反,有一个用于' Areas'有2个子文件夹。这是一个标准的家庭'区域/文件夹,其主文件夹和路径引擎访问的控制器,模型和视图的子文件夹。

我们还有一个' Applications'区域/文件夹(应用程序是指申请成为我们组织的一部分,而不是Web应用程序)。它具有与' Home'相同的子结构。控制器,模型和视图的文件夹分为子文件夹。在我们代码的当前工作版本中,可以使用指示正确区域的参数来访问任一区域(例如' ...。href="@Url.Action("Index", "Teacher", new { area = "Applications" })")'或方法,控制器和区域(例如{{ 1}}。

虽然' Home'在新的VS2017环境中,区域按预期运行,似乎新的路由引擎无法识别和定位“应用程序”中的控制器和视图。区域。它会为“应用程序”中的所有方法/视图返回404错误。区域。 有关为使原始项目与VS-2017兼容而需要进行哪些更改的任何指示,因为我在尝试访问第二个区域时遇到404错误'在项目运行时。

1 个答案:

答案 0 :(得分:0)

在global.asax.cs的application_start中,有一行代码进行区域注册。

AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);

注册后,您可以检查RouteTable.Routes并查看列表中路由的顺序已更改。您可以通过调试与VS2013和VS2017进行比较。因此,如果您像VS2013中一样对路由顺序进行了重新排序,则路由将再次起作用。 这是我的代码。

protected void ReArrangeRouteOrderForAreas()
    {
        try
        {
            RouteBase[] areaRoutes = new RouteBase[4];
            string[] areaRouteNames = new string[] { "area_1", "area_2", "area_3", "area_4" };

            for (int i = 3; i >= 0; i--)
            {
                //Remove the reversed area routes and assign them into an array.
                areaRoutes[i] = RouteTable.Routes[12];
                RouteTable.Routes.RemoveAt(12);
            }

            for (int i = 0; i < 4; i++)
            {
                //Add with the order in area_1/area_2/area_3/area_4
                RouteTable.Routes.Add(areaRouteNames[i], areaRoutes[i]);
            }
        }
        catch(Exception ex)
        {

        }

    }

解决方案是

        AreaRegistration.RegisterAllAreas();

        //In VS2017, route registration order for areas is reversed. The order is rearranged to serve the original setting.
        ReArrangeRouteOrderForAreas();

        RouteConfig.RegisterRoutes(RouteTable.Routes);