我创建了一个简单的MVC项目来测试URL的翻译。我正在使用nuget软件包RouteLocalization.MVC进行翻译。添加此程序包并对其进行配置后,路由会停止工作,即使URL与路由匹配,也会始终出现404 http错误。
在这里,一步一步地完成我的工作:
我配置了在URL中使用语言的路由。这是我的RouteConfig.cs
中的代码:
routes.MapRoute(
name: "Default",
url: "{lang}/{controller}/{action}/{id}",
constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" },
defaults: new { lang = "it", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default2",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我创建了一个自定义IControllerActivator
来更改语言,并在Global.asax
中注册了该语言:
public class LocalizedControllerActivator : IControllerActivator
{
private string _DefaultLanguage = "it";
public IController Create(RequestContext requestContext, Type controllerType)
{
//Get the {language} parameter in the RouteData
string lang = _DefaultLanguage;
if (requestContext.RouteData.Values["lang"] != null)
lang = requestContext.RouteData.Values["lang"].ToString();
if (lang != _DefaultLanguage)
{
try
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
catch (Exception e)
{
throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
}
}
return DependencyResolver.Current.GetService(controllerType) as IController;
}
}
此时,一切正常。而且,如果我在it
和en
之间切换,我会发现我的看法有所不同。
我添加了RouteLocalization.MVC NuGet软件包。我用翻译后的网址修饰了控制器/操作。
[RoutePrefix("HomeITA")]
public class HomeController : Controller
{
[Route("IndexITA", Name = "IndexRouteName")]
public ActionResult Index()
{
return View();
}
}
在路由配置之前的RouteConfig.cs
中,添加以下行:
routes.MapMvcAttributeRoutes(Localization.LocalizationDirectRouteProvider);
一切都停止了。我正在使用路由调试器来了解哪个是我的错误,但我不明白。结果如下:
IControllerActivator
在这里运行:IControllerActivator
在这里不会运行:怎么了? 想念你