我有一条路线规则:
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&param1 = price_from_50000,
但如果我删除param5,param6等,则一切正常:
网址= / hottours / tailand /曼谷/ 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个参数都是可选的(并以任意顺序排列),则应使用查询字符串,而不是将其放入路径中。
routes.MapRoute("HotToursPage",
"HotTours/{countryTo}/{resort}",
new
{
controller = "HotTours",
action = "Index"
}
);
一种替代方法(我不建议这样做)是建立一系列具有标识符段的路由,使您可以按任何顺序放置这些值。请参见带有Route的ASP.Net MVC处理段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句