是否可以传递将在路线段位置上重复的页码?

时间:2012-03-07 00:55:29

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

假设我将以下URL请求传递给路由系统,这是可能的最长URL。

存储/ storecontent /宠物/猫/食品/ 1

其中“1”是页码,而宠物是rootpointer

现在我的路线条目如下:

    routes.MapRoute(
    "StoreContent", // Route name
    "{controller}/{action}/{rootpointer}/{category}/{category2}/{page}", // URL with parameters
    new { rootpointer = UrlParameter.Optional, category= UrlParameter.Optional, category2 =     UrlParameter.Optional, page = UrlParameter.Optional},
new { controller = "Store", action = "StoreContent" });

我的方法是这样的:

public PartialViewResult StoreContent(string rootpointer, string category, string category2, int page) {}

问题是,当我传递像store / storecontent / pets / 1 这样的网址时,类别会被分配“页面”值,这是可以理解的,因为页面现在位于保留的路径段的位置对于类别和路由系统,无法告知哪个值属于页面,哪个值属于类别,因为这些是匿名类型。

有没有办法解决这个问题,我知道这可以通过使用catchall并解析它来提取值来手动完成,但有没有更优雅的解决方案,不需要任何人工干预?如果我的URL反映它,我也可能只使用类似/page-{page}/的东西,然后路由系统应该为页面匿名类型选择它并将其值正确地分配给方法的页面参数?

2 个答案:

答案 0 :(得分:2)

这不是路由的工作方式

如果您将路线定义为

{controller}/{action}/{rootpointer}/{category}/{category2}/{page}

然后使用 store / storecontent / pets / 1 访问您的网页,然后您的路由参数如下:

  • controller = store
  • action = storecontent
  • rootpointer = pets
  • category = 1
  • category2 = null
  • page = null

您要做的事实上是商店/商店内容/宠物/// 1 ,但您无法提供此类网址

的RESTful?

这也不是RESTful。为什么?因为提供网页作为网址的一部分会返回可以说是非确定性结果......

这就是为什么分页和排序应该(在REST方面)作为查询变量提供,如 store / storecontent / pets?page = 1 。这当然会奏效。它们成为与路由本身无关的任意变量。尝试这是否也适用于您的路由定义,因为它可能也可以工作,因为您的许多路段都是可选的。

可能的解决方案1 ​​

可能的解决方案(虽然我建议你继续将分页作为查询变量)将定义几个路由:

{controller}/{action}/{page}
{controller}/{action}/{rootpointer}/{page}
{controller}/{action}/{rootpointer}/{category}/{page}
{controller}/{action}/{rootpointer}/{category}/{category2}/{page}

每个都需要page = "\d+"上的约束,因此路由会一直跟着,直到正确的路由被击中。

可能的解决方案2

通过将页面保持为单独的查询参数,nobody表示您无法将其定义为默认值的一部分:

routes.MapRoute(
    "Some route",
    "{controller}/{action}/{rootpointer}/{category}/{category2}",
    new {
        rootpointer = UrlParameter.Optional,
        category= UrlParameter.Optional,
        category2 = UrlParameter.Optional,
        page = 1
    }
);

如您所见,我为页面提供了默认值。我知道你已经将它设置为可选,但我在这里说的是你可以为非路由相关值提供默认值。例如,查询变量。

附加观察

如果为控制器和操作提供单值常量约束,则无需像处理方式那样将它们作为路径值保留在路径定义中。您当前定义的当前路线最好是:

routes.MapRoute(
    "StoreContent", // Route name
    "Store/StoreContent/{rootpointer}/{category}/{category2}/{page}", // URL with parameters
    new {
        controller = "Store",
        action = "StoreContent",
        rootpointer = UrlParameter.Optional,
        category = UrlParameter.Optional,
        category2 = UrlParameter.Optional,
        page = UrlParameter.Optional
    }
    // no need for constraints
);

答案 1 :(得分:1)

您需要在页面变量

上添加另一个路径和正则表达式约束