【发布时间】: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