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

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

在我的Web.config我有:

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

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

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

第一种方法

我有以下控制器:

public void ChangeCulture(string lang)
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

        Response.Cookies.Remove("Language");
        var langCookie = new HttpCookie("Language");
        langCookie["Language"] = lang;
        langCookie.Value = lang;
        langCookie.Expires = System.DateTime.Now.AddDays(21);
        Response.Cookies.Add(langCookie);

        Response.Redirect(Request.UrlReferrer.ToString());
    }

第二种方法

public ActionResult ChangeCulture(string lang)
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

        // Split the url to url + query string
        var fullUrl= Request.UrlReferrer.ToString();
        var questionMarkIndex = fullUrl.IndexOf('?');
        string queryString = null;
        string url = fullUrl;
        if (questionMarkIndex != -1) // There is a QueryString
        {
            url = fullUrl.Substring(0,questionMarkIndex);
            queryString = fullUrl.Substring(questionMarkIndex + 1);
        }

        // Arranges
        var request = new HttpRequest(null,url,queryString);
        var response = new HttpResponse(new StringWriter());
        var httpContext = new HttpContext(request,response);

        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));

        // Extract the data    
        var values = routeData.Values;
        var controllerName = values["controller"];
        var actionName = values["action"];
        var areaName = values["area"];

        return RedirectToAction(actionName.ToString());
    }

我在哪里错了?谢谢.

解决方法

看来我需要覆盖我的资源字符串而不是线程的文化.所以我的最终方法是这样的:
public void ChangeCulture(string lang)
    {
         Resources.Resources.Culture = new CultureInfo(lang);

         Response.Redirect(Request.UrlReferrer.ToString());
    }

希望这可以帮助.

更新:

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

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

public void ChangeCulture(string lang)
    {
        Response.Cookies.Remove("Language");

        HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"];

        if (languageCookie == null) languageCookie = new HttpCookie("Language");

        languageCookie.Value = lang;

        languageCookie.Expires = DateTime.Now.AddDays(10);

        Response.SetCookie(languageCookie);

        Response.Redirect(Request.UrlReferrer.ToString());
    }

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

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {


        HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"];
        if (languageCookie != null)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo(languageCookie.Value);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCookie.Value);
        }
        else
        {
        //other code here
        }


        base.Initialize(requestContext);
    }
原文链接:https://www.f2er.com/csharp/93780.html

猜你在找的C#相关文章