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

时间:2011-01-07 14:13:24

标签: regex asp.net-mvc asp.net-mvc-routing constraints

我正在探索将MVC用于我的下一个电子商务网站的可能性。我似乎无法弄清楚的一件事是我是否可以使用我通常使用的相同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+" }
);

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

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

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

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

3 个答案:

答案 0 :(得分:5)

路由系统允许您定义catchall参数,忽略斜线和捕获 一切都到达URL的末尾。通过在其前面加上一个参数来将参数指定为catchall 星号(*)。

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

您在网址格式中只能有一个catchall参数,并且它必须是最后一个(即, 最右边的东西,因为它从那一点开始捕获整个URL路径。

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

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

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

答案 1 :(得分:0)

你可以使用MVC2中的区域

所以它会读到: 面积/控制器/视图/ ID

所以在你的情况下,它最终会成为:

体育是该地区, 网球控制器, 球拍视图, ProductA是ID或查询字符串,

http://www.asp.net/mvc/videos/aspnet-mvc-2-areas

希望这是有道理的。

答案 2 :(得分:0)

您需要访问网址的各个细分,因此您需要将类别细分分为两个细分。这样会更容易。

假设我们将这些类别中的网球和羽毛球类别和球拍称为产品类

您需要一种方法来访问category,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

}