我想在我的ASP.NET MVC应用程序中使用路由实现本地化。ASP.NET MVC路由。资源未找到
例如: www.example.com/Home/Index
- 将显示默认文化的内容。 www.example.com/en/Home/Index
- 将显示英文内容。 www.example.com/ru/Home/Index
- 俄语等等...
每个动作所以,我创建本地化属性:
public class LocalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.RouteData.Values["lang"] != null && !String.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
{
var lang = filterContext.RouteData.Values["lang"].ToString();
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
}
else
{
var langHeader = String.Empty;
langHeader = filterContext.HttpContext.Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(langHeader);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
base.OnActionExecuting(filterContext);
}
}
我加入这个属性在我的控制器的每一个动作。
和注册路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Localization",
"{lang}/{controller}/{action}/{id}",
new { lang = "en-US", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
导航到www.example.com/About/Contacts
工作正常。 但是,当我导航到www.example.com/en/About/Contacts
或类似的东西,我得到404 error
:找不到资源。 那么,可能是什么问题?
在此先感谢您的帮助!
非常感谢您的帮助!我安装了RouteDebugger,它真的说了以下内容 控制器:en 操作:关于 ID:联系人。 因此,我为lang和controller添加约束: constraints:new {lang = @“^ [az] {2} $”,controller = @“^ [a-zA-Z] {3,} $”} 但仍显示: 控制器:en 操作:关于 ID:联系人。 –
您无需为“本地化”路由添加约束,因为它只是使该路由更具体。正如我所说的那样,你想匹配的路线确实匹配,但是“默认”被调用,因为它是添加到路线中的最新路线(更底下的“重要”路线)。尝试切换路由的顺序或在“默认”路由中的Id参数上添加(例如)数字约束,以便它将使默认路由不再匹配该特定请求。 – chrisd84
不,没有。但是我注意到,我的“本地化”路由甚至不显示在RouteDebugger的“所有路由”表中,其中显示“默认”路由。如果我删除“默认”路线,没有任何变化。 谢谢你的时间! –