加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:45:49 所属栏目:百科 来源:网络整理
导读:我对MVC中的文化变迁有好奇心.我尝试了两种方式,但显然我在某个地方错了. 在我的Web.config我有: globalization uiCulture="auto" culture="auto" / 这是我如何改变线程文化: li@Html.ActionLink("Eng","ChangeCulture","Home",new { lang="en-US"},new {
我对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);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读