2012-02-24 53 views
2

我想有一条路线可以给出两个URL的选项,但映射到一个动作。多语言应用就是一个很好的例子。以英语和法语为例。MVC路由:如何将两个名称映射到一个动作

这似乎在第一个简单的,在技术上你可以这样做:

routes.MapRoute(
    "the hi route english" , 
    "welcome/sayhi/{id}" , 
    new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional } 
); 

routes.MapRoute(
    "the hi route french" , 
    "bienvenu/direallo/{id}" , 
    new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional } 
); 

但是,这意味着你必须定义每个动作两条路线。或者稍微好一些的解决方案,创建一个自定义的Route类,该类需要更多的参数来处理双语。

如果我去选项1或2,这意味着我必须定义WelcomeController的每条路由,因为我不能在我的路由中使用{action}。

理想情况下,我希望能够通过元数据定义至少动作名称,然后通过反射或其他东西来获取动作名称。

即:

[ActionName({ "fr", "direallo" }, {"en", "sayhi"})] 
public ActionResult SayHi(string id){ 
    //check current thread culture... 
} 

我不太知道从哪里开始,任何想法?提示?

谢谢

+1

可能重复http://stackoverflow.com/questions/2146227/how-to-route-a-multiple-language-url-with- a-mvc – 2012-02-24 15:23:19

+0

其相当不错,但我是窝确定是否有某种方法可以避免在控制器之外建立字典。 – 2012-02-24 21:08:20

+0

在我看来,这是一个配置项目,无论如何都应该在控制器之外。但是,这只是我的两美分 – 2012-02-24 21:12:26

回答

1

您有几种选择这里出发点,大概他们是(以实现复杂的顺序):

  • 每一种语言的途径(如你上面列出)
  • A regex route constraint例如

    routes.MapRoute(
        "the hi route", 
        "{controllerName}/{actionName}/{id}", 
        new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional }, 
        new { controllerName = @"welcome|bienvenu", actionName = @"sayhi|direallo" } 
    ); 
    
  • 您可以创建一个基本的控制器,这是由每种语言的子类继承和每个基地控制器的操作方法定义特定语言的动作名称

  • 你可以创建你自己(或使用one提供在answer的评论由贾斯汀皮胡尼)自定义路由约束
+0

如果这些是唯一的选择,我想最后一个仍然是最优雅的解决方案,我已经得到它的工作:) – 2012-02-27 13:19:22

+0

当你的域定义你所使用的语言时,这会变得棘手。那么你必须根据语言添加链接。 – 2012-02-28 19:27:10

相关问题