我有一个路由规则:
routes.MapRoute("HotToursPage",
"HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}/{param4}/{param5}",
new
{
controller = "HotTours",
action = "Index",
countryTo = UrlParameter.Optional,
resort = UrlParameter.Optional,
param1 = UrlParameter.Optional,
param2 = UrlParameter.Optional,
param3 = UrlParameter.Optional,
param4 = UrlParameter.Optional,
param5 = UrlParameter.Optional
}
);
在我的代码中:
var dictionary = new RouteValueDictionary();
aaa.Add("countryTo", countryToInfo.Translit);
aaa.Add("resort", resort);
aaa.Add("param1", param1);
string url = urlHelper.Action("Index", "HotTours", dictionary);
如果有param5、param6和其他,则
url=/hottours/?countryTo=tailand&度假村=曼谷;param1=price_from_50000,
但是如果我删除param5,param6和其他,那么一切都好:
url=/hottours/tailand/bangkok/price_from_50000
为什么如果段数小于7,一切都好?我需要9个片段,但urlHelper在这种情况下构建了错误的url。
构建URL时,必须提供URL模式中的所有路由值。有一个例外——当最后一个参数是可选的时,你不需要包括它
因此,为了一致地处理在长URL模式中可能是可选的分段,您需要多个路由。每条路由只能有一个UrlParameter.Optional
,并且必须是最右边的段。
routes.MapRoute("HotToursPage3",
"HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}/{param4}/{param5}",
new
{
controller = "HotTours",
action = "Index",
param5 = UrlParameter.Optional
}
);
routes.MapRoute("HotToursPage2",
"HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}",
new
{
controller = "HotTours",
action = "Index",
param3 = UrlParameter.Optional
}
);
routes.MapRoute("HotToursPage1",
"HotTours/{countryTo}/{resort}/{param1}",
new
{
controller = "HotTours",
action = "Index",
param1 = UrlParameter.Optional
}
);
注意:我在此假设您的
{countryTo}
和{resort}
参数是必需的。让它们成为可选项似乎并不明智。然而,如果我错了,你需要另一条路线来处理这两个可选的段,或者你应该为它们提供合理的默认值。一般来说,如果某个值没有合理的默认值,则URL中应该需要该值。
请注意,如果没有提供位于其右侧的任何分段,则仍然只能将分段设为可选。因此,这种组合将起作用:
var dictionary = new RouteValueDictionary();
dictionary.Add("countryTo", "test1");
dictionary.Add("resort", "test2");
dictionary.Add("param1", "test3");
var url = Url.Action("Index", "HotTours", dictionary);
但这种组合仍然会构建一个查询字符串:
var dictionary = new RouteValueDictionary();
dictionary.Add("countryTo", "test1");
dictionary.Add("resort", "test2");
dictionary.Add("param1", "test3");
dictionary.Add("param2", "test4");
dictionary.Add("param5", "test5");
var url = Url.Action("Index", "HotTours", dictionary);
如果您希望所有5个param都是可选的(并且按任何顺序),则应该使用查询字符串,而不是将它们放入路径中。
routes.MapRoute("HotToursPage",
"HotTours/{countryTo}/{resort}",
new
{
controller = "HotTours",
action = "Index"
}
);
另一种选择(我不建议)是建立一系列具有标识符段的路线,这允许您按任何顺序放置值。请参阅ASP.Net MVC使用路由处理分段。
正如您在下面提到的,没有什么是的主要原因
Http.sys服务的编码默认为每个Url段最多260个字符。
此上下文中的"Url段"是Url中"/"个字符之间的内容。例如:
可以使用注册表设置更改允许的最大Url段长度:
Key: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesHTTPParameters
Value: UrlSegmentMaxLength
Type: REG_DWORD
Data: (Your desired new Url segment maximum allowed length, e.g. 4096)
允许的最大值为32766。如果指定了一个更大的值,它将被忽略。
需要重新启动电脑才能使对此设置的更改生效。