ASP.NET MVC中与语言相关的路由

时间:2009-09-08 10:05:39

标签: asp.net-mvc routing

有没有人在使用ASP.NET MVC制作语言相关路线方面有经验?我想做的是有本地化的网址来改善SEO。例如,http://mysite.com/products/cars会映射到与http://mysite.com/produkter/bilar相同的控制器/操作?

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

编辑:到目前为止,Mato肯定有最好的解决方案,我希望看到一个Custom RouteHandler解决方案作为参考。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以实现一个自己的控制器工厂类,在初始化之前转换控制器名称。例如,您可以将翻译存储在资源文件或DB中。最简单的方法是从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));
        }
    }
}

答案 2 :(得分:1)

您可以使用正则表达式路由(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"  })
});

答案 3 :(得分:0)

我不推荐使用基于Regex的方法,因为它会容易出错,除了要求对所有可用的URL模式进行强大的手动定制(对于非平凡的网站来说,这可能是一个真正的痛苦)。 / p>

正如@Runeborg所述,我强烈建议采用更自动化的方式完成工作。对于MVC 5(和<)Web应用程序,我总是使用以下一个,我发现这是我在最近几年尝试过的最通用的一个。

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

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

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

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