c# – 根据链接MVC4改变文化

前端之家收集整理的这篇文章主要介绍了c# – 根据链接MVC4改变文化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对MVC中的文化变迁有好奇心.我尝试了两种方式,但显然我在某个地方错了.

在我的Web.config我有:@H_301_3@

  1. <globalization uiCulture="auto" culture="auto" />

这是我如何改变线程文化:@H_301_3@

  1. <li>@Html.ActionLink("Eng","ChangeCulture","Home",new { lang="en-US"},new { @class = "languageSelectorEnglish" })</li>

第一种方法@H_301_3@

我有以下控制器:@H_301_3@

  1. public void ChangeCulture(string lang)
  2. {
  3. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang);
  4. Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
  5.  
  6. Response.Cookies.Remove("Language");
  7. var langCookie = new HttpCookie("Language");
  8. langCookie["Language"] = lang;
  9. langCookie.Value = lang;
  10. langCookie.Expires = System.DateTime.Now.AddDays(21);
  11. Response.Cookies.Add(langCookie);
  12.  
  13. Response.Redirect(Request.UrlReferrer.ToString());
  14. }

第二种方法@H_301_3@

  1. public ActionResult ChangeCulture(string lang)
  2. {
  3. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang);
  4. Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
  5.  
  6. // Split the url to url + query string
  7. var fullUrl= Request.UrlReferrer.ToString();
  8. var questionMarkIndex = fullUrl.IndexOf('?');
  9. string queryString = null;
  10. string url = fullUrl;
  11. if (questionMarkIndex != -1) // There is a QueryString
  12. {
  13. url = fullUrl.Substring(0,questionMarkIndex);
  14. queryString = fullUrl.Substring(questionMarkIndex + 1);
  15. }
  16.  
  17. // Arranges
  18. var request = new HttpRequest(null,url,queryString);
  19. var response = new HttpResponse(new StringWriter());
  20. var httpContext = new HttpContext(request,response);
  21.  
  22. var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
  23.  
  24. // Extract the data
  25. var values = routeData.Values;
  26. var controllerName = values["controller"];
  27. var actionName = values["action"];
  28. var areaName = values["area"];
  29.  
  30. return RedirectToAction(actionName.ToString());
  31. }

我在哪里错了?谢谢.@H_301_3@

解决方法

看来我需要覆盖我的资源字符串而不是线程的文化.所以我的最终方法是这样的:
  1. public void ChangeCulture(string lang)
  2. {
  3. Resources.Resources.Culture = new CultureInfo(lang);
  4.  
  5. Response.Redirect(Request.UrlReferrer.ToString());
  6. }

希望这可以帮助.@H_301_3@

更新:@H_301_3@

当您的应用程序被多个用户使用时,上面的代码不是很好,因为它为每个用户设置相同的文化,无论他们使用什么浏览器.@H_301_3@

这样做的好方法是在浏览器中设置一个cookie:@H_301_3@

  1. public void ChangeCulture(string lang)
  2. {
  3. Response.Cookies.Remove("Language");
  4.  
  5. HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"];
  6.  
  7. if (languageCookie == null) languageCookie = new HttpCookie("Language");
  8.  
  9. languageCookie.Value = lang;
  10.  
  11. languageCookie.Expires = DateTime.Now.AddDays(10);
  12.  
  13. Response.SetCookie(languageCookie);
  14.  
  15. Response.Redirect(Request.UrlReferrer.ToString());
  16. }

之后(棘手的方法),您需要使每个控制器从一个BaseController继承.这是棘手的,因为你需要重写Initialize.@H_301_3@

  1. protected override void Initialize(System.Web.Routing.RequestContext requestContext)
  2. {
  3.  
  4.  
  5. HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"];
  6. if (languageCookie != null)
  7. {
  8. Thread.CurrentThread.CurrentCulture = new CultureInfo(languageCookie.Value);
  9. Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCookie.Value);
  10. }
  11. else
  12. {
  13. //other code here
  14. }
  15.  
  16.  
  17. base.Initialize(requestContext);
  18. }

猜你在找的C#相关文章