【问题标题】:Why this routing is not catched?为什么这个路由没有被捕获?
【发布时间】:2021-10-21 21:37:09
【问题描述】:

我正在尝试捕获没有定义地图的“所有路线”并重定向到自定义页面。 这样:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "PageNotFound",
        url: "{*url}",
        defaults: new { controller = "Home", action = "Error" }
    );
}

如果我加载存在于控制器/操作域中的页面,它可以工作(即默认运行正确)。 相反,如果我尝试输入诸如“www.mywebsite.com/asd”之类的内容,它不会捕获 PageNotFound 路由规则,而是框架触发器:

protected void Application_Error()
{

}

我哪里错了?我想避免 Application_Error 错误触发,如果(例如)控制器不存在,则只路由到自定义页面。

编辑 注释后编辑的代码:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "MyAppName.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;

routes.MapRoute(
    name: "PageNotFound",
    url: "{*url}",
    defaults: new { controller = "Home", action = "Error" },
    namespaces: new string[] { "MyAppName.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;

还是同样的问题。

【问题讨论】:

  • 是的,你可以。看看这里的答案:stackoverflow.com/questions/4612279/… - DataTokens["UseNamespaceFallback"] = false 是关键
  • @NicolaBiada 不幸的是,不。将.DataTokens["UseNamespaceFallback"] = false; 添加到最后一个MapRoute() 不会改变任何内容。 Application_Error 仍然被触发,并且不会发生任何循环。我已经编辑了问题,因此您可以看到我根据您的建议编辑的内容。
  • 你在 MVC .net 4.6.x 上,对吗?
  • 是的,但我认为你误导了这个问题:) 不是在范围之外“找到其他控制器”;相反,如果框架找不到匹配项(即控制器不存在,如“/asd”),我想将任何请求重定向到自定义错误页面。我认为在默认地图上使用“默认”是有问题的......
  • 我试试看。几年前,当我在框架上工作时,我遇到了同样的问题,并且使用 Useadefault.. 参数解决了“catch all unrouted”。

标签: asp.net model-view-controller routes .net-4.6.1


【解决方案1】:

经过一些尝试,我找到了一个部分解决方案:

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //routes.MapRoute(
            //    name: "Default",
            //    url: "{controller}/{action}/{id}",
            //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            //);

            routes.MapRoute(
                name: "Home_Default",
                url: "Home/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
            
            routes.MapRoute(
                name: "Customer_Default",
                url: "Customer/{action}/{id}",
                defaults: new { controller = "Customer", action = "Index", id = UrlParameter.Optional }
            );

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

...

现在/abc/homes 路由已匹配。

不幸的是,/home/baubau 仍然无法匹配

您可以通过 web.config捕获所有此错误页面。
在您的 web.config 末尾添加:


  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" responseMode="ExecuteURL" path="/CatchAll/Index" />
    </httpErrors>
  </system.webServer>
</configuration>

【讨论】:

  • 它仍然会触发我不想要的 Application_Error()。基本上,在 Application_Error() 中,我记录了应用程序的每个错误。我只是不想记录这些(即当控制器不存在时)
  • 我认为这在旧框架下是不可能的。使用 .net Core 你有很多新的解决方案。您可以将您的项目转换为 .net Core 3 或 .net 5 吗?
  • 我认为这是解决这个问题的有效方法stackoverflow.com/a/68657969/365251
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2015-10-29
  • 2017-06-18
  • 2011-04-12
相关资源
最近更新 更多