【问题标题】:Custom catch-all parameter in routing路由中的自定义包罗万象参数
【发布时间】:2009-05-08 00:12:27
【问题描述】:

我最近想要一个特殊的路由规则:{*whatever}/details/{Id}/{itemName}

我知道一旦我运行应用程序就会引发异常。在我的应用程序中,例如我的 url 模式是 www.domain.com/root/parent/child/.../child/details/30/itemname

但是当前路由不支持这个。如何自定义路由处理程序以使其工作?

【问题讨论】:

  • 您要求(任意)深度嵌套资源的宁静路由正确吗?像文件系统一样?

标签: asp.net asp.net-mvc url-routing


【解决方案1】:

已经编写了一个支持这个的类

我已经编写了这样一个类,它可以处理 URL 中任何地方的 catch-all 段。它有相当多的代码,但它按预期工作,我已经在一个实际项目中使用它。

Check it out yourself 看看它是否满足您的需求。

【讨论】:

    【解决方案2】:

    问题是……它如何知道何时停止?

    {*whatever} 段将匹配:

    /foo/
    /foo/bar
    /foo/bar/details/4/moreFoo
    /foo/bar/andmore/details/4/moreFoo
    

    因为 catch-all 参数包含任何内容,所以它永远不会停止。

    实现这一点的唯一方法是为您使用详细信息的每个地方创建不同的路线...

    例如:

    games/details/{id}/{itemName}
    widgets/details/{id}/{itemName}
    books/details/{id}/{itemName}
    

    当然,这已经在默认的 {controller}/{action}/{id} 路由中提供了

    【讨论】:

    • 可以的。 GetRouteData 从头开始​​解析路由。当涉及到一个贪婪的包罗万象的参数时,它会反转解析并从后面解析。当它回到贪婪的 catch-all 参数时,它会将所有剩余的内容放入其中。我认为这里没有问题。这样,只要最多有一个贪婪的 catch-all 参数,就可以在 URL 中的任何位置捕获所有内容。
    • 有趣,我不知道这个。自 .Net Routing 首次引入以来,一直是这样吗?
    • 它不能开箱即用。但我已经指出,从技术上讲,在 URL 的任何地方都没有包罗万象的限制。而且我还编写了一个自定义的Route 类来支持这个。它也被用于现实生活中的项目,所以我可以告诉你它是有效的。 erraticdev.blogspot.com/2011/01/…
    【解决方案3】:

    我认为您可能希望查看扩展 System.Web.Routing.RouteBase 类并覆盖 GetRouteData() 方法。有了它,您可以查看请求的 url 并确定是否与您的模式匹配,如果匹配,则构造并返回一个新的 RouteData 实例,该实例指向您要处理请求的控制器和操作。否则,如果您与请求的 url 不匹配,则返回 null。

    请参阅以下示例:

    Pro ASP.NET MVC Framework By Steve Sanderson

    Custom RouteBase

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2016-08-20
      • 2011-04-02
      • 2011-10-13
      • 2021-04-25
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多