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

Regex 不确定文件夹数的.Net MVC路由(嵌套类别结构),regex,asp.net-mvc,asp.net-mvc-routing,constraints,Regex,Asp.net Mvc,Asp.net Mvc Routing,Constraints,我正在探索在我的下一个电子商务网站上使用MVC的可能性。有一件事我似乎无法弄清楚,那就是我是否可以使用我通常使用的URL约定。目前,任何产品的URL都可以是以下内容之一: 类别/子类别/Product1.html 类别/子类别/子类别/Product2.html 类别/子类别/子类别/Product3.html Category/SubCategory/SubSubCategory/SubSubCategory/Product4.html 等等 我遇到的问题是嵌套的类别结构。到目前为止,我唯

我正在探索在我的下一个电子商务网站上使用MVC的可能性。有一件事我似乎无法弄清楚,那就是我是否可以使用我通常使用的URL约定。目前,任何产品的URL都可以是以下内容之一:

  • 类别/子类别/Product1.html
  • 类别/子类别/子类别/Product2.html
  • 类别/子类别/子类别/Product3.html
  • Category/SubCategory/SubSubCategory/SubSubCategory/Product4.html
等等

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

routes.MapRoute(
    "Products",
    "{categories}/{productname}",
    new { controller = "Product", action = "Details", productname = UrlParameter.Optional },
    new { categories = @"\w+/\w+" }
);
我希望{categories}可以与以下任何一个匹配,我可以处理这些匹配以确定产品所属的正确类别:

  • 运动/网球/球拍/ProductA
  • 运动/羽毛球/球拍/ProductB
但是上面显示的路线不能正常工作


是否有人知道如何实现这一点,或者如果无法实现这一点?

您可以使用MVC2中的区域

因此,它将是: 区域/控制器/视图/id

因此,在您的情况下,它最终将是:

体育是一个领域, 网球控制员, 在这一观点中, ProductA是一个ID或查询字符串


希望这是有意义的。

路由系统允许您定义catchall参数,这些参数忽略斜杠和捕获 直到URL结尾的所有内容。通过在参数前面加上 星号(*)

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

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

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


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

您需要访问URL的各个段,因此需要将类别段划分为两个段。这会让事情变得容易得多

比方说,我们把网球和羽毛球分类以及这些分类中的球拍称为产品类别

您需要一种访问类别、productClass和productName参数的方法。假设“运动”在这种情况下是固定的,我将这样做:

routes.MapRoute(
"Products",
"sport/{category}/{productClass}/{productName}",
new { controller = "Product", action = "Details", productClass = UrlParameter.Optional, productName = UrlParameter.Optional }
))

你的行动方法是这样的

public ActionResult Details(string category, string productClass, string productName){
//Do whatever you need to do in order to get the specified product

}

区域是一种将大型站点划分为更小的可管理部分的方法,可能具有不同的布局、不同的控制器和视图。然而,我认为这个问题是如何在一个产品控制器中处理文件夹层次结构。谢谢各位——是的,马丁,这更像是我要说的。所以我可能有两个不同的类别,都叫做球拍,每个都有不同的父类别和与之相关的不同产品。目前,我用文件夹层次结构来表示类别结构/层次结构,正如您所说的,只是还没有找到一种方法来为其构建路由。
public ActionResult Details(string category, string productClass, string productName){
//Do whatever you need to do in order to get the specified product