首页 文章

ASP.NET MVC路由捕获所有

提问于
浏览
1

我正在使用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常规快递,但我仍然转发到我的404页面 .

任何帮助表示赞赏!

4 回答

  • 0

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

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

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

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

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

  • 0

    你试过这个吗?

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

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

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

    编辑:
    根据我的评论,据我所知,你不熟悉开发中间件,我在GitHub上发布了一个演示项目,演示了如何通过三个简单的步骤开发中间件 . 您可以下载项目here .

  • 0

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

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

相关问题