使用正则表达式捕获所有不起作用的路由

时间:2009-12-02 02:21:05

标签: c# asp.net-mvc routes

我知道第一条路线会捕捉大部分路径。但是,这也会捕获/ Product / Edit / blablabla(我正在使用ASP.NET路由调试器):

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

        routes.MapRoute(
            "Default", 
            "{controller}/{action}/{id}",                          
            new { controller = "Home", action = "Index", id = @"\d{1,}" }
        );

        routes.MapRoute(
            "Catch All",
            "{*path}",
            new { controller = "Error", action = "NotFound" }
        );
    }

但这是错的!为什么?如果不是长度为1的整数,则第一条路线不匹配。我还需要处理未找到的coutroller和动作......任何想法?

非常感谢!

3 个答案:

答案 0 :(得分:8)

您应该将表达式放在第四个参数中。阅读本文:

http://www.asp.net/LEARN/MVC/tutorial-24-cs.aspx

清单3。

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );

正则表达式\ d +匹配 一个或多个整数。此约束导致Product路由匹配 以下网址:

      
  • /产品/ 3
  •   
  • /产品/ 8999

但不是以下网址:

      
  • /产品/苹果
  •   
  • /产品


这些浏览器请求将是 由另一条路线处理,或者,如果没有匹配的路线,则 The 无法找到资源将返回错误。

答案 1 :(得分:0)

您误解了MapRoute扩展方法。

第三个参数是路径参数的一组默认值。

在您的情况下,您告诉它id参数的默认值为\d{1,}

答案 2 :(得分:0)

编辑:已解决。

[HandleError]

将(自动)将异常对象传递给Error.aspx视图,该视图显示内部消息。

<customErrors mode="On" defaultRedirect="/Error/NotFound" />

将调用ErrorController方法“NotFound”,它显示(静态)aspx视图。