ASP.NET MVC 路由包罗万象

ASP.NET MVC Routing catch all

我正在使用 ASP.NET Core MVC 并在我的控制器中使用属性路由。

在 Startup.cs 的 Configure 方法中,我目前调用 app.UseMvc() 来启动我的 MVC 应用程序。

一切正常。

现在我正试图让一个包罗万象,但 404 总是占尽优势。

我将 app.UseMvc 更改为以下内容:

app.UseMvc(routes =>
{
    routes.MapRoute("Default",
                    "{*catchall}",
                    new { controller = "Index", action = "Index" },
                    new { catchall = @"^(.*)?$" });
});

但没有骰子。

我什至也尝试删除 catchall regular express,但我仍然被转发到我的 404 页面。

感谢任何帮助!

你试过吗?

routes.MapRoute(
    "Default",
    "{*.}",
     new { controller = "Home", action = "Index" } 
);

在您的 Startup.cs 文件中,将这行代码放在 Configure() 方法的 app.UseMvc() 上方。显然你可以重定向到你想要的任何页面。

app.UseStatusCodePagesWithRedirects("~/Home/Index");

编辑:
根据您的评论,据我所知,您必须编写自己的中间件来重定向并保留原始 url/query 参数。如果您不熟悉开发中间件,我在 GitHub 上发布了一个演示项目,演示了如何通过三个简单步骤开发中间件。您可以下载项目 here.

因此,如果我对您的理解正确,您只需要一条在其余路线不匹配时使用的路线。据我所知,有两种方法可以解决这个问题。正确的方法是编写一些路由中间件,但肮脏的解决方案是创建一个包含所有可空参数的路由,这些参数将作为最后一个匹配。

routes.MapRoute(
     "DirtyRoutingSolution",
     "{notUsed?}/{notUsedTwo?}/{notUsedThree?}/{notUsedFour?}",
     new { controller = "Home", action = "Index"}
);

对于遇到同样问题的任何人,Tom Droste 将我推向了正确的方向

添加常规路由并使用属性路由具有微妙的副作用 catch-all路由先添加到路由字典中,然后再添加属性路由。

A​​ttributeRouting class 只是创建了一个 AttributeRoute 实例,它是一个负责构建属性路由的 IRouter。这是在第一次调用 AttributeRoute 时完成的

如此一来,catchall 就再也没有被调用过,因为它不是最后一条路线。 将所有内容放回常规路由中解决了问题。

我建议阅读 https://luisfsgoncalves.wordpress.com/2015/08/18/asp-net-5-routing-part-ii/ 以了解属性路由的工作原理