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路由先添加到路由字典中,然后再添加属性路由。
AttributeRouting class 只是创建了一个 AttributeRoute 实例,它是一个负责构建属性路由的 IRouter。这是在第一次调用 AttributeRoute 时完成的
如此一来,catchall 就再也没有被调用过,因为它不是最后一条路线。
将所有内容放回常规路由中解决了问题。
我建议阅读 https://luisfsgoncalves.wordpress.com/2015/08/18/asp-net-5-routing-part-ii/ 以了解属性路由的工作原理
我正在使用 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路由先添加到路由字典中,然后再添加属性路由。
AttributeRouting class 只是创建了一个 AttributeRoute 实例,它是一个负责构建属性路由的 IRouter。这是在第一次调用 AttributeRoute 时完成的
如此一来,catchall 就再也没有被调用过,因为它不是最后一条路线。 将所有内容放回常规路由中解决了问题。
我建议阅读 https://luisfsgoncalves.wordpress.com/2015/08/18/asp-net-5-routing-part-ii/ 以了解属性路由的工作原理