urlHelper 构建错误的路径.. 这是什么原因?
The urlHelper build wrong path.. What is a rison for this?
我的路由规则为:
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&resort=bangkok¶m1=price_from_50000,
但如果我删除 param5、param6 和其他,则一切正常:
url=/hottours/tailand/bangkok/price_from_50000
为什么段数小于7就可以了?我需要 9 个分段,但 urlHelper 在这种情况下构建错误 url。
没有像你下面提到的那样是主要原因
Http.sys 服务编码为每个 Url 段默认最多 260 个字符。
这里的"Url segment"是Url中“/”字符之间的内容。例如:
允许的最大 Url 段长度可以通过注册表设置更改:
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters
Value: UrlSegmentMaxLength
Type: REG_DWORD
Data: (Your desired new Url segment maximum allowed length, e.g. 4096)
最大允许值为32766。如果指定了一个更大的值,它将被忽略。
需要重新启动电脑才能使此设置的更改生效。
构建 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
}
);
NOTE: I am assuming here that your {countryTo}
and {resort}
parameters are required. It doesn't seem that sensible to make them optional. However, if I am mistaken, you need another route to deal with those 2 segments being optional or alternatively you should provide sensible default values for them. Generally speaking, if there are no sensible defaults for a value it should be required in the URL.
请注意,如果提供了 none 右侧的段,您仍然只能将段设为可选 。因此,这个组合会起作用:
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 个参数都是可选的(并且以任何顺序),您应该使用查询字符串,而不是将它们放入路径中。
routes.MapRoute("HotToursPage",
"HotTours/{countryTo}/{resort}",
new
{
controller = "HotTours",
action = "Index"
}
);
另一种方法(我不推荐)是建立一系列具有标识符段的路由,这允许您以任何顺序放置值。参见 。
我的路由规则为:
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&resort=bangkok¶m1=price_from_50000,
但如果我删除 param5、param6 和其他,则一切正常:
url=/hottours/tailand/bangkok/price_from_50000
为什么段数小于7就可以了?我需要 9 个分段,但 urlHelper 在这种情况下构建错误 url。
没有像你下面提到的那样是主要原因
Http.sys 服务编码为每个 Url 段默认最多 260 个字符。
这里的"Url segment"是Url中“/”字符之间的内容。例如:
允许的最大 Url 段长度可以通过注册表设置更改:
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters
Value: UrlSegmentMaxLength
Type: REG_DWORD
Data: (Your desired new Url segment maximum allowed length, e.g. 4096)
最大允许值为32766。如果指定了一个更大的值,它将被忽略。
需要重新启动电脑才能使此设置的更改生效。
构建 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
}
);
NOTE: I am assuming here that your
{countryTo}
and{resort}
parameters are required. It doesn't seem that sensible to make them optional. However, if I am mistaken, you need another route to deal with those 2 segments being optional or alternatively you should provide sensible default values for them. Generally speaking, if there are no sensible defaults for a value it should be required in the URL.
请注意,如果提供了 none 右侧的段,您仍然只能将段设为可选 。因此,这个组合会起作用:
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 个参数都是可选的(并且以任何顺序),您应该使用查询字符串,而不是将它们放入路径中。
routes.MapRoute("HotToursPage",
"HotTours/{countryTo}/{resort}",
new
{
controller = "HotTours",
action = "Index"
}
);
另一种方法(我不推荐)是建立一系列具有标识符段的路由,这允许您以任何顺序放置值。参见