【问题标题】:Language dependent routes in ASP.NET MVCASP.NET MVC 中的语言相关路由
【发布时间】:2010-11-26 11:01:04
【问题描述】:

有没有人有过使用 ASP.NET MVC 制作依赖于语言的路由的经验?我想做的是有本地化的 url 来改善 SEO。例如http://mysite.com/products/cars 会映射到与http://mysite.com/produkter/bilar 相同的控制器/动作?

我尝试浏览了一下,但找不到类似的东西。我什至不相信这真的是一个好主意,但我想当用户使用他们自己的语言进行搜索时,它会帮助 SEO。我想这需要对 mvc 路由引擎进行一些定制。

编辑:到目前为止,Mato 肯定有最好的解决方案,但我希望看到自定义 RouteHandler 解决方案以供参考。

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    我不会推荐基于正则表达式的方法,因为它很容易出错,除了需要对所有可用的 URL 模式进行高水平的手动自定义(这对于非平凡的网站来说可能是一个真正的痛苦)。

    正如@Runeborg 所说,我强烈推荐一种更自动化的方式来完成这项工作。对于 MVC 5(和

    你基本上需要实现三件事:

    • 多语言感知路由来处理传入的 URL(如果您使用 MVC5 或更高版本,您也可以使用 基于属性的路由,但我仍然更喜欢使用处理此问题的全局规则)。
    • 一个 LocalizationAttribute 来处理这些类型的多语言请求。
    • 在您的应用程序中生成这些 URL 的辅助方法Html.ActionLink 和/或Url.Action 扩展方法)。

    有关更多详细信息和代码示例,请参阅this answer

    有关此主题的更多信息和更多示例,您还可以阅读我在此主题上写的 this blog post

    【讨论】:

      【解决方案2】:

      你可以实现一个自己的控制器工厂类,它在初始化之前翻译控制器名称。例如,您可以将翻译存储在资源文件或数据库中。最简单的方法是从 DefaultControllerFactory 继承并覆盖 CreateController 函数。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace System.Web.Mvc
      {
          class CustomControllerFactory : DefaultControllerFactory
          {
              public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
              {
                  /**
                   * here comes your code for translating the controller name 
                   **/
      
                  return base.CreateController(requestContext, controllerName);
              }
          }
      }
      

      最后一步是在应用程序启动时注册您的控制器工厂实现(在 Global.asax 中)。

      namespace MyApplication
      {
          public class MvcApplication : System.Web.HttpApplication
          {
              protected void Application_Start()
              {
                  ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));
              }
          }
      }
      

      【讨论】:

      • 这听起来很有趣,不幸的是,除了控制器名称之外,url 还有其他部分,例如区域和操作。所以我认为这可能最好在路线层面解决。但也许这也可以在这里处理?
      • 由于您可以通过 RequestContext 访问 Request 对象,因此您可以操作您想要的每个参数。所以此时翻译区域或动作没有问题。
      • 嗯,你的意思是修改routedata的区域/控制器/动作?是的,如果在路由之后进行评估,这实际上可能会起作用。
      【解决方案3】:

      您可以使用正则表达式路由 (http://iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx),然后执行类似的操作

      routes.Add(new RegexRoute(@"^(Products|Produkter)$", new MvcRouteHandler())
      {
          Defaults = new RouteValueDictionary(new { controller = "Products"  })
      });
      

      【讨论】:

      • 是的,这很有趣。但我想有一种更自动化的方式来做这件事。我可能应该更多地考虑扩展类似于 RegexRoute 的 Route 类。
      【解决方案4】:

      关于 SEO 的一件事是,如果搜索引擎在两个不同的链接上找到两个相同的文档,它可能会降低其中一个页面的页面排名。然后,您还需要翻译页面内容。

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 2011-03-20
        • 1970-01-01
        • 2013-12-11
        • 2012-10-01
        • 2016-06-19
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多