asp.net – 如何在全球范围内更改路线?
我想在MVC 3中切换两种语言 – PL和EN.我在Views-EN和PL中创建了两个文件夹.因此,在任何网站点击相应的语言链接后,我希望我的路线更改为:
routes.MapRoute( "pl",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "PL",action = "Index",id = UrlParameter.Optional } // Parameter defaults ); 至: routes.MapRoute( "en",// URL with parameters new { controller = "EN",id = UrlParameter.Optional } // Parameter defaults ); 当我单击适当的链接(语言切换器)时,它会更改对所有线程持久的CultureInfo. <ul> <li>@Html.ActionLink("En","ChangeCulture",null,new { lang = "en"},null)</li> <li>@Html.ActionLink("Pl",new { lang = "pl"},null)</li> </ul> 和控制器(它还设置静态变量lang,可以在每个控制器的方法中看到并在请求之间保持不变): public ActionResult ChangeCulture(string lang) { PLController.lang = lang; CultureSettings setCulture = new CultureSettings(); setCulture.InitializeCulture(lang); cookie.Value = CultureInfo.CurrentCulture.Name; this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); return View("Index"); } InitializeCulture方法从Page类重写,如下所示: public class CultureSettings : Page{ public void InitializeCulture(string culture) { String selectedLanguage; if(culture == null) { selectedLanguage = "pl"; } else { selectedLanguage = culture; } UICulture = selectedLanguage; Culture = selectedLanguage; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage); Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); base.InitializeCulture(); } } 它正确设置了CultureInfo.现在我想(根据当前的CultureInfo)切换每个导航链接的路线并将路线模式从mysite.com/PL/ {controller} / {action}更改为mysite.com/EN/{controller}/{action}. 有没有人有任何想法或更好的方法来解决这个问题?但条件是地址必须看起来像这个mysite.com/EN或mysite.com/PL – 没有区别(即en.mysite.com) 解决方法
您必须决定的第一件事是存储当前用户语言的位置.有不同的可能性:
>每个网址的一部分 恕我直言,为了搜索引擎优化的目的,最好将它作为网址的一部分. 所以我建议编写一个自定义路由,它将解析url中的语言并设置当前的线程文化: public class LocalizedRoute : Route { public LocalizedRoute() : base( "{lang}/{controller}/{action}/{id}",new RouteValueDictionary(new { lang = "en-US",controller = "home",action = "index",id = UrlParameter.Optional }),new RouteValueDictionary(new { lang = @"[a-z]{2}-[a-z]{2}" }),new MvcRouteHandler() ) { } public override RouteData GetRouteData(HttpContextBase httpContext) { var rd = base.GetRouteData(httpContext); if (rd == null) { return null; } var lang = rd.Values["lang"] as string; if (string.IsNullOrEmpty(lang)) { // pick a default culture lang = "en-US"; } var culture = new CultureInfo(lang); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; return rd; } } 我们现在可以在Global.asax中注册这个自定义路由: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("Default",new LocalizedRoute()); } 好的,现在让我们有一个模型: public class MyViewModel { [DisplayFormat(DataFormatString = "{0:d}")] public DateTime Date { get; set; } } 控制器: public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel { Date = DateTime.Now }); } public ActionResult Test() { return Content(DateTime.Now.ToLongDateString()); } } 并且观点: @model MyViewModel @Html.DisplayFor(x => x.Date) <ul> <li>@Html.ActionLink("switch to fr-FR","index",new { lang = "fr-FR" })</li> <li>@Html.ActionLink("switch to de-DE",new { lang = "de-DE" })</li> <li>@Html.ActionLink("switch to en-US",new { lang = "en-US" })</li> </ul> @Html.ActionLink("Test culture","test") 现在,当您点击链接时,我们正在更改语言,此语言现在是路线的一部分.请注意,一旦选择了该语言,该语言将保留在测试链接的路由中. Scott Hanselman还写了一篇关于ASP.NET的本地化和全球化的nice blog post,值得一试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在ASP.NET MVC中,response.redirect如何工作
- 集成EntLib实现ASP.NET MVC的异常处理
- 是否使用ASP.NET配置文件?
- asp.net-mvc – 具有指定操作的Response.RedirectToRoute
- asp.net – 在EPiServer中的TinyMCE中允许自定义HTML属性
- 如何制作100%宽度的asp.net菜单
- asp.net-mvc – ASP.NET MVC 5和HTML 5根据W3C规范形成属性
- asp.net-mvc-2 – TempData未按预期清除
- asp.net – 在Visual Studio 2012中创建控制器时出错
- asp.net – 在IE11中无法正确显示站点
- asp.net-mvc – ASP.NET MVC 5 Web应用程序性能低
- asp.net – Response.Redirect(Request.Url.Abso
- ASP.Net页面刷新后自动滚动到原来位置
- ASP.net MVC验证突出显示和不正确的字段Jquery上
- 如何在IIS / ASP.Net中创建长期存在的对象?
- asp.net – AS3将数据传递给ASP
- asp.net-mvc-3 – 用于API访问的WCF或Asp.Net MV
- asp.net – RequiredFieldValidator不适用于Drop
- asp.net-mvc-3 – 如何在Razor视图引擎中注册程序
- asp.net-mvc – mvc.net如何在迭代列表时使用强类