2010-06-10 19 views
7

我从迁移ASP.NET MVC 1到ASP.NET MVC 2网站目前,该网站支持以下路线:ASP.NET MVC 2 - 做UrlParameter.Optional条目必须在路由的末尾?

/{country}/{language}/{controller}/{action} 
/{country}/{controller}/{action} 
/{language}/{controller}/{action} 
/{controller}/{action} 

countrylanguage是区分由正则表达式和所拥有的格式适当的限制。在MVC 1中,我将其中的每一个注册为一个单独的路由 - 对于大约20个组合中的每一个。在MVC 2中,我一直试图通过UrlParameter.Optional使用UrlParameter.Optional来解决所有四种情况,但我似乎无法使其工作 - 如果我将countrylanguage定义为可选,则路由例如,/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

如果可以实现这样的路由系统,我也很感兴趣...... – 2010-06-10 13:47:38

+0

而不是将它们全部集中在一起,为什么不定义多个路由来处理呢? – 2010-06-10 14:06:55

+0

如果您阅读了问题的中间部分,那就是我目前正在做的事情。但在四个组合时间20种不同类型的路线,这是很多映射。我试图找出是否可以使用UrlParameter.Optional来简化此操作。 – 2010-06-10 14:13:19

回答

2

嗯。有趣。

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

你可以映射这样的近视路线:

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

然后,在你的定位器控制器,可以重定向到正确的动作,但是你会想:

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

我一个便宜的招数。我能说什么?

+0

那么,值得+1作为唯一的答案,并提出一些可行的东西 - 但显然我宁愿避免重定向。不过谢谢。 – 2010-06-15 07:46:17

+0

是的。这并不漂亮。我不会自己使用它。但是,嘿,我认为这可能是唯一可行的选择。 – 2010-06-15 08:43:05

+0

嗯,这绝对是我得到的最好的答案(!),所以得到答案... – 2010-06-18 13:45:03