.Net MVC路由未确定的文件夹数(嵌套类别结构)

Gar*_*mes 3 regex asp.net-mvc constraints asp.net-mvc-routing

我正在探索将MVC用于我的下一个电子商务网站的可能性.我似乎无法弄清楚的一件事是我是否可以使用我通常使用的相同URL约定.目前,任何产品的URL可以是以下之一:

  • 类别/子/ Product1.html
  • 类别/子/ SubSubCategory/Product2.html
  • 类别/子/ SubSubCategory/Product3.html
  • 类别/子/ SubSubCategory/SubSubSubCategory/Product4.html

等等

我遇到的问题是嵌套的类别结构.到目前为止,我唯一想到的是如下:

routes.MapRoute(
    "Products",
    "{categories}/{productname}",
    new { controller = "Product", action = "Details", productname = UrlParameter.Optional },
    new { categories = @"\w+/\w+" }
);
Run Code Online (Sandbox Code Playgroud)

我希望{categories}可以与以下任何一个匹配,我可以处理这些以确定产品所属的正确类别:

  • 运动/网球/ 球拍 /产品A.
  • 运动/羽毛球/ 球拍 /产品B.

但是上面显示的路线无法正常工作.

有谁知道如何实现这一目标,或者是否无法实现?

Eri*_*sch 5

路由系统允许您定义catchall参数,这些参数忽略斜杠并捕获到URL末尾的所有内容.将参数指定为catchall,前缀为星号(*).

routes.MapRoute(null, "Articles/{*articlePath}",
    new { controller = "Articles", action = "Show" }
);
Run Code Online (Sandbox Code Playgroud)

您只能在URL模式中有一个catchall参数,并且它必须是URL中的最后一个(即最右边的),因为它从该点开始捕获整个URL路径.

但需要注意的是,它不会从查询字符串中捕获任何内容,因为路由对象只会查看URL的路径部分.

如果您允许访问者浏览某种任意深度层次结构(例如在内容管理系统(CMS)中),则Catchall参数非常有用.

您可以使用RouteData对象提取有关路径的信息.根据您的需要,您可能会创建一个自定义路由处理程序来解析路由数据并调用正确的控制器方法.