我正在使用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页面。
感谢任何帮助!
答案 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"}
);