我想在我的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的「所有路由」表中,其中顯示「默認」路由。如果我刪除「默認」路線,沒有任何變化。 謝謝你的時間! –