【发布时间】:2016-05-30 09:13:31
【问题描述】:
我有一个路由规则:
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。
【问题讨论】:
-
只有最后一个参数可以是可选的(除非您提供所有参数,否则路由引擎无法确定哪个值属于哪个段,因此将这些值添加为查询字符串值)
-
不,不仅最后一个参数可能是可选的。在我的情况下,所有参数都可以是可选的。我可以写 localhost:9285/hottours/tailand/bangkok/price_from_50000 或 localhost:9285/hottours/tailand/bangkok/price_from_50000/from_moscow 并且所有的工作都是正确的。直到我在路由规则中写的变量不超过 6 个。当我在路由规则中添加超过 6 个变量时,urlHelper 构建 url 错误
-
不,你不明白 只有路由定义中的最后一个参数可以用
UrlParameter.Optional标记。如果您尝试使用Url.Action(),如果您不提供所有参数,它将生成查询字符串值(不是路由值)。删除countryTo = UrlParameter.Optional, ...... param4 = UrlParameter.Optional,,只留下param5 = UrlParameter.Optional -
但是为什么所有工作都是正确的,当我写 url localhost:9285/hottours/tailand/bangkok/price_from_50000 和 localhost:9285/hottours/tailand/bangkok/price_from_50000/from_moscow 和 localhost:9285/hottours /泰国/曼谷/?并且 UrlHelper 构建 url 绝对正确,当我在 RouteValueDictionary 中给出 2、3、.. 6 参数时
-
除非参数完全按顺序添加,否则不会 - 尝试
string url = urlHelper.Action("Index", "HotTours", new { param3 = "xxxx");了解。但是你的路由只有 7 个段,所以任何额外的都必须是查询字符串值
标签: asp.net-mvc routes segments urlhelper