ASP.NET MVC路由捕获所有

时间:2016-04-26 15:48:25

标签: asp.net-core asp.net-mvc-routing asp.net-core-mvc

我正在使用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 = @"^(.*)?$" });
});

但没有骰子。

我甚至尝试删除了常规快递,但我仍然转发到我的404页面。

感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

对于有同样问题的人,Tom Droste将我推向了正确的方向

添加传统路线并使用属性路由具有微妙的副作用 首先在路由字典中添加了catch-all路由,然后添加了属性路由。

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

有了这个,因此它从未被调用,因为它不是最后的路线。 把一切都放回传统的路由中解决了这个问题。

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

答案 1 :(得分:0)

你试过这个吗?

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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