是否可以传递将在管段位置上重新显示的页码
本文关键字:新显示 显示 位置 段位置 是否 | 更新日期: 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+"};