ASP.NET MVC 2 - 做UrlParameter.Optional条目必须在路由的末尾吗?

Dav*_*d M 7 asp.net-mvc asp.net-mvc-routing

我正在将一个站点从ASP.NET MVC 1迁移到ASP.NET MVC 2.目前,该站点支持以下路由:

/{country}/{language}/{controller}/{action}
/{country}/{controller}/{action}
/{language}/{controller}/{action}
/{controller}/{action}
Run Code Online (Sandbox Code Playgroud)

Regex 的格式countrylanguage可区分,并具有适当的约束.在MVC 1中,我将每个作为单独的路线注册 - 对于大约20种组合中的每一种.在MVC 2中,我一直在尝试使用一条路径来处理所有四种情况,使用UrlParameter.Optional,但我似乎无法使其工作 - 如果我定义country并且language作为两个可选,那么路由/Home/Index例如不没有成功匹配路线.这就是我想要做的:

routes.MapRoute("Default",
    "{country}/{language}/{controller}/{action}",
    new { country = UrlParameter.Optional, language = UrlParameter.Optional,
        controller = "Home", action = "Index" },
    new { country = COUNTRY_REGEX, language = LANGUAGE_REGEX });
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为我的选项是在路线的开头,还是我只是遗漏了什么?我找不到任何文件要么告诉我我在做什么是不可能的,要么指出我正确的方向.

Eva*_*gle 2

唔。有趣的。

这是我能想到的最好的。我猜这是一个坏主意,但这是我能想到的唯一解决方法。我有兴趣听到一些建议/疑虑/投诉。

你可以像这样绘制一条近视路线:

routes.MapRoute(
    "Localized",
     "{*loc}",
     new { controller = "Localizer", action = "RedirectIt" },
     new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE }
); 
Run Code Online (Sandbox Code Playgroud)

然后,在您的 Localizer 控制器中,您可以根据需要重定向到正确的操作:

public class LocalizerController : Controller
{
    public ActionResult RedirectIt(string loc)
    {
        //split up the loc string
        //and determine the correct redirect path for the request
    }
}
Run Code Online (Sandbox Code Playgroud)

我是个爱耍小便宜的人。我能说什么?