Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET MVC路由捕获所有_Asp.net Core_Asp.net Mvc Routing_Asp.net Core Mvc - Fatal编程技术网

Asp.net core ASP.NET MVC路由捕获所有

Asp.net core ASP.NET MVC路由捕获所有,asp.net-core,asp.net-mvc-routing,asp.net-core-mvc,Asp.net Core,Asp.net Mvc Routing,Asp.net Core Mvc,我在控制器中使用ASP.NET核心MVC和属性路由 在Startup.cs中的Configure方法中,我当前调用app.UseMvc()来启动我的MVC应用程序 一切正常 现在,我正试图让一个catchall开始,但404总是得到最好的情况 我将app.UseMvc更改为以下内容: app.UseMvc(routes => { routes.MapRoute("Default", "{*catchall}",

我在控制器中使用ASP.NET核心MVC和属性路由

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

一切正常

现在,我正试图让一个catchall开始,但404总是得到最好的情况

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

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

我甚至还试图删除catchall常规快车,但我仍然被转发到我的404页面

感谢您的帮助

你试过这个吗

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

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

app.UseStatusCodePagesWithRedirects("~/Home/Index");
编辑:

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

因此,如果我正确理解您的意思,您只需要一条路线,当其他路线不匹配时,该路线就是您想要的路线。据我所知,有两种方法可以解决这个问题。正确的方法是编写一些路由中间件,然而糟糕的解决方案是创建一个包含所有可为空参数的路由,这些参数将作为最后一个参数进行匹配

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

对于有同样问题的人,汤姆·德罗斯特把我推向了正确的方向

添加常规路由和使用属性路由具有微妙的副作用 首先在路由字典中添加“全部捕获”路由,然后添加属性路由

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

因此,catchall从未被命名,因为它不是最后一条路线。 把所有的东西都放回传统的路线解决了这个问题


我建议阅读以了解属性路由的工作原理

是的,这与从我上面发布的内容中删除正则表达式相同。请确认您有一个带有
Index()
action的
IndexController
。我的IndexController有
[Route(“”)
,它有一个方法
Index()
,设置如下:
[HttpGet]public IActionResult Index(){return View();}
我想你把基于约定的路由和属性路由弄混了。您的全部捕获将应用于不使用属性路由的控制器。这是针对web api控制器还是mvc控制器的。mvc控制器如何为我的属性路由设置catchall查看本文,看看它是否为您提供了一些想法。我已经为catch all做了一些事情,但它是为mvc的早期版本做的,不适用。。但是,我如何保留查询参数,什么不保留?比如说我转到/thispage/doesnot/exist,它将重定向到~/Home/Index,但我想在url中保留/thispage/doesnot/exist…酷看起来很有趣!我来看看。我的问题是,为什么不应用默认路由呢?这可能是一个bug。RC1中有很多这样的内容。我也无法让它工作。正确,我希望如果路由/ABC不存在,它将加载/而将/ABC保留在url中。基本上,任何不匹配的路由都应该加载我的default。如果是这样,这是一个快速而肮脏的解决方案。只需创建“未使用”的数量,因为您的url最长。这样它会捕捉到所有内容。我复制粘贴了您上面所写的内容,如果我放置/ABC,它仍然会将我带到404页面。。。似乎这条路从来没有被叫来过。属性路由之前是否设置了常规路由?从技术上讲,这条路线应该是最后一条,如果我错了请纠正我是的,这应该是最后一条路线。我已经创建了一个测试项目,它运行得很好。请在主控制器中创建一个测试操作,并在其中放置一个断点。通过这种方式,您可以查看是该路线不起作用,还是其他路线将其拾取。如果是路线,请告诉我。然后我需要修复我自己的项目也XD@Domze有进展吗?