这是我的网址格式:
controller/action/p1/p2/p3/
在路由中我有这个规则:
url:
{controller}/{action}/{p1}/{p2}/{p3}/
defaults:
new { controller = "controller", action = "action", p1= "", p2= "", p3= "" }
在控制器中我有:
action(p1 = "", p2 = "", p3 = "")
{
...
}
我需要传递此网址controller/action//p2/p3/
,其中p1 = ""
问题出在操作方法中,如果p1 = ""
默认为p2
的值。我的意思是p1
现在需要p2
的价值。
我怎么能让这个工作?也许如果我添加更多路由,或者是否有另一种解决方法来完成空参数之间的传递?
答案 0 :(得分:0)
假设所有p都是字符串,区分不同路由的唯一方法是参数的数量。所以为了实现以下映射:
controller/action/p2/p3/
您可以通过在具有三个参数的那个之前添加以下映射来完成此操作:
url:
{controller}/{action}/{p2}/{p3}/
defaults:
new { controller = "controller", action = "action", p2= "", p3= "" }
但是,如果不使用QueryString参数,则无法使用相同数量的参数并以不同方式映射它们,例如:
controller/action?p1=""&p3=""
答案 1 :(得分:0)
您可以使用空属性链接进行各种组合,例如:
var defaultObj = new { controller = "controller", action = "action", p1 = UrlParameter.Optional, p2 = UrlParameter.Optional, p3 = UrlParameter.Optional };
string[] combinations = {
"{controller}/{action}/{p1}/{p2}/{p3}",
"{controller}/{action}//{p2}/{p3}",
"{controller}/{action}/{p1}//{p3}",
"{controller}/{action}/{p1}/{p2}/",
};
for (int i = 0; i < combinations.Length; i++)
{
routes.MapRoute(
name: "route" + i.ToString(),
url: combinations[i],
defaults: defaultObj
);
}
不是最佳解决方案,但适用于我。