有没有人在使用ASP.NET MVC制作语言相关路线方面有经验?我想做的是有本地化的网址来改善SEO。例如,http://mysite.com/products/cars会映射到与http://mysite.com/produkter/bilar相同的控制器/操作?
我试过浏览一下,但我找不到类似的东西。我甚至不相信它真的是一个好主意,但我想,当用户用他们自己的语言进行搜索时,它会帮助搜索引擎优化。我想这会需要对mvc路由引擎进行一些定制。
编辑:到目前为止,Mato肯定有最好的解决方案,我希望看到一个Custom RouteHandler解决方案作为参考。
答案 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应用程序,我总是使用以下一个,我发现这是我在最近几年尝试过的最通用的一个。
你基本上需要实现三件事:
Html.ActionLink
和/或Url.Action
扩展方法)。有关详细信息和代码示例,请参阅this answer。
有关此主题的其他信息和更多示例,您还可以阅读我就此主题撰写的this blog post。