ASP.NET MVC路由的高级路由行为

时间:2009-10-20 06:17:16

标签: asp.net-mvc asp.net-mvc-routing

给定一个遵循以下模式的网址:

firstcolor = {VALUE1} / secondcolor = {} VALUE2

其中value1和value2可以变化,动作方法如下:

ProcessColors(string color1,string color2)在一个名为ColorController的控制器中。

我想要以下路线评估:

URL'/ firstcolor = red'导致调用类似ProcessColors(“red”,null)
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种颜色,并且能够拥有这样的网址,我们最终将会有大量的路线:

'/ firstcolor =蓝/ secondcolor =红/ thirdcolor =绿色/ fourthcolor =黑'
'/ firstcolor =蓝/ thirdcolour =红色'
'/ thirdcolour =红/ fourthcolour =黑'

依此类推,即我们需要迎合任何组合,因为firstcolor总是在2nd之前,2nd将始终在3rd之前,依此类推。

忽略我荒谬的例子,有没有什么好方法可以解决这种不需要创建许多路线和动作方法的情况?

2 个答案:

答案 0 :(得分:2)

首先,如果您打算使用key=value格式,那么我建议使用QueryString而不是URL。

但如果没有,你可以这样做:

//register this route
routes.MapRoute("color", "colors/processcolors/{*q}",
    new { controller = "Color", action ="ProcessColors" });

然后在ColorController

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);
}

在这种情况下,您的网址将如下所示:

site.com/colors/processcolors/red
site.com/colors/processcolors/red/green

答案 1 :(得分:0)

在我们使用通配符映射的情况下,我想我们失去了使用Html.ActionLink为我们构建URL的能力?