【问题标题】:Advanced Routing Behaviour with ASP.NET MVC Routing使用 ASP.NET MVC 路由的高级路由行为
【发布时间】:2009-10-20 06:17:15
【问题描述】:

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

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 种颜色并能够拥有这样的 URL,我们最终会得到大量路由:

'/firstcolor=blue/secondcolor=red/thirdcolor=green/fourthcolor=black'
'/第一种颜色=蓝色/第三种颜色=红色'
'/thirdcolour=red/fourthcolour=black'

等等,即我们需要满足任何组合,因为 firstcolor 总是在 2nd 之前,2nd 总是在 3rd 之前等等。

忽略我这个荒谬的例子,有没有什么好的方法来处理这种不需要创建大量路由和操作方法的情况?

【问题讨论】:

  • 不要这样做。 = 符号是根据 URI RFC (ietf.org/rfc/rfc3986.txt) 保留的,除非经过编码,否则不应成为查询之外的合法 URI 的一部分。正如çağdaş所说,使用查询,而不是路径。

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


【解决方案1】:

首先,如果您要使用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);
}

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

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

【讨论】:

    【解决方案2】:

    如果我们使用通配符映射,我想我们会失去使用 Html.ActionLink 为我们构建 URL 的能力?

    【讨论】:

    • 您必须构建自己的 ActionLink 扩展,例如ActionLinkForColors("red", "blue", "green", "orange" ...)
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2010-12-23
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2014-09-11
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多