【问题标题】:Catch all routes not working using regular expression使用正则表达式捕获所有不起作用的路由
【发布时间】:2009-12-02 02:21:05
【问题描述】:

我知道第一条路线会捕获大部分路径。但是,这也会捕获 /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" }
        );
    }

但这是错误的!为什么?如果不是长度为 min 1 的整数,则第一条路由不应匹配。我还需要处理未找到的 coutroller 和操作...有什么想法吗?

非常感谢!

【问题讨论】:

  • @ 符号表示什么?它应该在引号内吗?
  • @ 符号告诉 C# 编译器忽略转义码。例如:@"\"@"\""\"

标签: c# asp.net-mvc routes


【解决方案1】:

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

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
  • /Product/8999

但不包括以下网址:

  • /产品/苹果
  • /产品


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

【讨论】:

    【解决方案2】:

    您误解了MapRoute 扩展方法。

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

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

    【讨论】:

      【解决方案3】:

      编辑:已解决。

      [HandleError]
      

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

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

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

      【讨论】:

      • 您可以使用 new {productId = @"\d+" } 为 Edit 定义额外的路由。
      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多