是否可以传递将在管段位置上重新显示的页码

本文关键字:新显示 显示 位置 段位置 是否 | 更新日期: 2023-09-27 18:27:03

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

商店/商店内容/宠物/猫/食物/1

其中"1"是页码,pets是根指针

现在我的路线条目看起来是这样的:

    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的URL时,类别会被分配"页面"值,这是可以理解的,因为页面现在位于为类别保留的路由段的位置,路由系统无法判断哪个值属于页面,哪个值属于类别,因为这些都是匿名类型。

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

是否可以传递将在管段位置上重新显示的页码

这不是路由的工作方式

如果您将路线定义为

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

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

  • controller=存储
  • action=存储内容
  • rootpointer=宠物
  • 类别=1
  • category2=空
  • page=空

您要做的实际上是store/content/pets///1,但您无法提供这样的URL

RESTful

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

这就是为什么分页和排序应该(在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}

其中的每一个都需要对CCD_ 2进行约束,所以路由会一直进行,直到命中正确的一个。

可能的解决方案2

通过将页面作为一个单独的查询参数,并没有人说您不能将其定义为默认值的一部分:

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

正如您所看到的,我已经为page提供了一个默认值。我知道您已经将其设置为可选,但我在这里要说的是,您可以为与路由无关的值提供默认值。例如,查询变量。

附加观察

如果为控制器和动作提供单值常量约束,则无需像以前那样将它们作为管线值保留在管线定义中。你目前定义的路线最好是:

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
);

您需要在页面变量上添加另一个路由和正则表达式约束

  • http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

    routes.MapRoute("StoreContent2","{controller}/{action}/}rootpointer}/{page}",new{rootpointer=UrlParameter。可选,page=UrlParameter.可选},new{controller="Store",action="StoreContent"}),new{page=@"''d+"};