【问题标题】:MVC Routing: How to map two names to one actionMVC 路由:如何将两个名称映射到一个操作
【发布时间】:2012-03-15 01:04:12
【问题描述】:

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

一开始这似乎很简单,技术上你可以做到:

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...
}

我不太确定从哪里开始,有什么想法吗?提示?

谢谢,

【问题讨论】:

  • 它非常好,但我想知道是否有某种方法可以避免在控制器之外构建字典。
  • 我认为这是一个配置项,无论如何都应该在控制器之外。但这只是我的两分钱

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


【解决方案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" }
    );
    
  • 您可以创建一个基本控制器,由每种语言的子类继承,并为每个基本控制器操作方法定义一个特定于语言的操作名称

  • 您可以创建自己的(或使用 answer Justin Pihony 的评论中提供的 one)自定义路由约束

【讨论】:

  • 如果这些是唯一的选择,我想最后一个仍然是最优雅的解决方案,而且我已经开始工作了 :)
  • 当您的域定义了您所使用的语言然后您必须根据语言添加链接时,这会变得很棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2013-06-21
  • 1970-01-01
  • 2015-09-29
  • 2012-03-12
相关资源
最近更新 更多