匹配ASP.NET MVC路由/

时间:2011-08-18 14:45:18

标签: asp.net-mvc-2 routing

我知道当有一个表格的路线时

Alpha/Bravo/{Charlie}

和另一个表单

Alpha/Bravo/Delta/{Echo}

第一条路线将匹配两条路线的所有路线,因为Delta / {Echo}被接受为{Charlie}。虽然在组织路线时这可能是一种痛苦,但它也可以用于简化目的。我希望能够在路由字符串的中间使用此概念。我想做点像

Alpha/{Bravo}/Charlie

匹配表单

的网址
Alpha/bravo/Charlie

Alpha/bravo/bravo2/Charlie

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

使用正则表达式路由。类似以下内容可能会将{variant}参数与1个或多个尾随数字匹配

routes.MapRoute(
    "Title",
    "Controller/something/{variant}/Action",
    new { controller = "Controller", action = "Action" },
    new { variant = @"something\d+" }
);

你的路线看起来有点奇怪(也许它缺少一些花括号),但我的回答描述了你如何在你的路线中使用正则表达式的许多参数。

使用您的确切路线,Controller / something / {variant} / Action(再次,这很奇怪),我的映射路线将捕获如下的请求:

/Controller/something/something123/Action
/Controller/something/something1/Action

但不是

/Controller/something/somethingelse/Action
/Controller/something/nothing/Action

修改

如果{variant}没有模式,那么我认为你不能使用正则表达式。否则,路由不是这样设计的。

如果您想要多个参数变量,请使用多个reqular表达式

routes.MapRoute(
    "Title",
    "Controller/{something}/{variant}/Action",
    new { controller = "Controller", action = "Action" },
    new { variant = @"something\d+", something = @"(something|somethinglese)" }
);

如果您需要{something}是可选的,我不记得了,但您可能需要将其移至最后一个参数并将路线更改为:

    routes.MapRoute(
    "Title",
    "Controller/{variant}/Action/{something}",
    new { controller = "Controller", action = "Action", something = UrlParameter.Optional },
    new { variant = @"something\d+", something = @"(something|somethinglese)" }
);

答案 1 :(得分:0)

我最后添加了第二条路线,所以现在我已经

routes.MapRoute(
    "Route1",
    "Alpha/{Bravo}/{Charlie}/Delta",
    new { controller = "Alpha", action = "Delta" }
);

routes.MapRoute(
    "Route1",
    "Alpha/{Bravo}/Delta",
    new { controller = "Alpha", action = "Delta", Charlie = ""}
);

并在控制器中:

public ActionResult Delta(string Bravo, string Charlie)
{
    Bravo += Charlie;
    //everything else
}

现在一切顺利,虽然我希望有一条路线可以捕获这两种情况。