Asp.net mvc ASP.NET MVC路由的高级路由行为
给定一个遵循以下模式的url: firstcolor={value1}/secondcolor={value2} 其中value1和value2可能会发生变化,操作方法如下: ProcessColor(字符串color1,字符串color2)在一个名为ColorController的控制器中 我需要以下路线评估: URL“/firstcolor=red”导致类似ProcessColor(“red”,null)的调用Asp.net mvc ASP.NET MVC路由的高级路由行为,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,给定一个遵循以下模式的url: firstcolor={value1}/secondcolor={value2} 其中value1和value2可能会发生变化,操作方法如下: ProcessColor(字符串color1,字符串color2)在一个名为ColorController的控制器中 我需要以下路线评估: URL“/firstcolor=red”导致类似ProcessColor(“red”,null)的调用 URL“/secondcolor=blue”会导致类似ProcessColors
URL“/secondcolor=blue”会导致类似ProcessColors(null,“blue”)的调用
URL“firstcolor=red/secondcolor=blue”以类似ProcessColors(“red”、“blue”)的调用结束 从现在开始,我认为这可以通过一些路线来实现,像这样的
route.MapRoute(null,
"firstcolor={color1}/secondcolor={color2}",
new { controller=ColorController, action = ProcessColors })
route.MapRoute(null,
"firstcolor={color1}}",
new { controller=ColorController, action = ProcessColors, color2 = (string)null })
route.MapRoute(null,
"secondcolor={color2}}",
new { controller=ColorController, action = ProcessColors, color1 = (string)null })
这对于2种颜色来说已经足够了,但据我所知,如果我们想要有,比如说4种颜色,并且能够有如下URL,我们最终会得到大量的路由:
“/firstcolor=蓝色/secondcolor=红色/thirdcolor=绿色/fourthcolor=黑色”“/firstcolor=蓝色/ThirdColor=红色”
“/ThirdColor=红色/FourthColor=黑色” 依此类推,也就是说,我们需要满足任何组合,因为第一种颜色总是在第二种之前,第二种颜色总是在第三种之前,依此类推
忽略我荒谬的例子,有没有什么好方法可以处理这种不需要创建大量路由和操作方法的情况?首先,如果您要使用
key=value
格式,那么我建议使用QueryString而不是URL
但如果没有,您可以这样做:
//register this route
routes.MapRoute("color", "colors/processcolors/{*q}",
new { controller = "Color", action ="ProcessColors" });
然后在颜色控制器中
:
public ActionResult ProcessColors(string q) {
string[] colors = GetColors(q);
return View();
}
private string[] GetColors(string q) {
if (String.IsNullOrEmpty(q)) {
return null;
}
return q.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}
在这种情况下,您的URL将如下所示:
site.com/colors/processcolors/red
site.com/colors/processcolors/red/green
site.com/colors/processcolors/red
site.com/colors/processcolors/red/green
在使用通配符映射的情况下,我想我们将无法使用Html.ActionLink为我们构建URL?不要这样做。=符号是根据URI RFC()保留的,除非经过编码,否则不应是查询外部合法URI的一部分。正如çağdaş所说,使用查询,而不是路径。您必须构建自己的ActionLink扩展,例如ActionLinkForColors(“红色”、“蓝色”、“绿色”、“橙色”)