我正在将一个站点从ASP.NET MVC 1迁移到ASP.NET MVC 2.目前,该站点支持以下路由:
/{country}/{language}/{controller}/{action}
/{country}/{controller}/{action}
/{language}/{controller}/{action}
/{controller}/{action}
country
和language
的格式可由Regex区分,并具有合适的约束条件。在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 });
这是不可能的,因为我的选项是在路线的开头,还是我只是遗漏了什么?我找不到任何文件要么告诉我我在做什么是不可能的,要么指出我正确的方向。
答案 0 :(得分:2)
嗯。有趣。
这是我能想到的最好的。我猜这是一个坏主意,但这是我能想到的唯一解决方法。我有兴趣听一些建议/关注/投诉。
您可以像这样映射近视路线:
routes.MapRoute(
"Localized",
"{*loc}",
new { controller = "Localizer", action = "RedirectIt" },
new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE }
);
然后,在Localizer控制器中,您可以重定向到您想要的正确操作:
public class LocalizerController : Controller
{
public ActionResult RedirectIt(string loc)
{
//split up the loc string
//and determine the correct redirect path for the request
}
}
我是一个廉价技巧的人。我能说什么?