【问题标题】:Override webforms with MVC routing使用 MVC 路由覆盖 Web 表单
【发布时间】:2015-10-09 15:34:11
【问题描述】:

我正在开发一个现有的 ASP.NET 网络表单项目 - 慢慢更新到 MVC。我试图通过路由到新的 MVC 控制器有条件地覆盖一些现有的 web 表单页面。我可以轻松地将“example.aspx”URL 路由到 MVC 控制器,但如果存在现有的“example.aspx”文件,它就不起作用。

示例代码:

routes.MapRoute
            (
                name: "example",
                url: "example.aspx",
                defaults: new
                {
                    controller = "Example",
                    action = "Index"
                }
                constraints: new { useMvc= "1" }
            );

上面的代码工作正常,并按预期路由到控制器,除非我的解决方案中有一个现有的“example.aspx”文件 - 在这种情况下,它会路由到那个。但这正是我想要覆盖的。

现有的网络表单路由是否给予优惠待遇?有什么办法可以规避吗?

我找到了使用 MapPageRoute() 进行反向操作的机制,但据我所知,这对我没有帮助。

【问题讨论】:

  • 如果你想覆盖,为什么不在添加路由后删除example.aspx
  • @mason:因为它是基于约束条件的。有时我想覆盖,但有时我需要旧功能。
  • @DavidG:很高兴找到那个链接。不幸的是,正如那里所述,runAllManagedModulesForAllRequests 选项带有性能和安全问题。同样,我想避免使用 URLRewriter 选项,因为它不是基础 C#。在 C# 中肯定有一种方法可以重新路由旧的 Web 表单页面(不删除它们)?
  • @ScottHammer 除非您运行的网站对性能至关重要,否则我认为您无需担心。

标签: c# asp.net asp.net-mvc webforms asp.net-mvc-routing


【解决方案1】:

您可以将您的应用程序配置为忽略您通过 MVC 处理的特定路由。您可以在注册新路由之前添加以下行:

routes.IgnoreRoute("{*path}/example.aspx");

希望这会有所帮助。

【讨论】:

  • 已经试过了。据我所知,您的路线中的内容并不重要。如果有一个与调用的 URL 匹配的 asp 网络表单,那么它会自动覆盖指定的路由 - 无论它们是否已设置或是否设置为被忽略。
【解决方案2】:

我还没有解决上述问题,但我找到了一种解决方法,可以达到相同的结果。

1) 我将“example.aspx”文件重命名为“foo.aspx”

2) 添加了类似于我原来的问题的 MapRoute()(有约束)

3) 使用 MapPageRoute() 将所有其他“example.aspx”调用路由到“foo.aspx”

我最终还不得不使用 QueryStringConstraint 逻辑,如 another stackoverflow answer: 但这是一个单独的问题。

在标记我自己的答案之前,我将把这个问题留几天,看看是否有“真正的”解决方案。

【讨论】:

  • 也许更好:您可以将其移动到另一个目录,而不是重命名原始文件。例如,名为“WebformsRoutedByMVC”的目录。唯一的要求是原来的内置路由将不再根据给定的 URL 找到文件。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2015-06-24
  • 2023-04-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多