MVC路由:如何将两个名称映射到一个动作

时间:2012-02-24 15:18:03

标签: c# asp.net-mvc asp.net-mvc-routing multilingual

我希望有一条路线可以选择两个网址,但会映射到一个动作。一个很好的例子是多语言应用。让我们以英语和法语为例。

起初看起来很简单,从技术上讲,你可以做到:

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 个答案:

答案 0 :(得分: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来提交Justin Pihony的评论)自定义路由约束