urlHelper生成错误的路径.这是什么笑话



我有一个路由规则:

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。如果指定了一个更大的值,它将被忽略。

需要重新启动电脑才能使对此设置的更改生效。

相关内容

  • 没有找到相关文章

最新更新