【问题标题】:Programmatically set Culture of User Controls in ASP.NET在 ASP.NET 中以编程方式设置用户控件的文化
【发布时间】:2011-02-02 15:45:05
【问题描述】:

我想以编程方式设置我的用户控件的文化,它定义了几个标签、按钮和文本框......

通常,对于 aspx 页面,您会覆盖 InitializeCulture-Method 并设置 Culture 和 UICulture 来实现这一点,可惜 ASCX-Controls 没有此方法,那么我该怎么做呢?

我已经设置了本地资源 mycontrol.ascx.de-DE.resx、mycontrol.ascx.resx 和 mycontrol.ascx.en-GB.resx 但只设置了默认文件的值 (mycontrol.ascx.resx ) 被使用。

提前致谢。

丹尼斯

【问题讨论】:

    标签: c# asp.net user-controls resources ascx


    【解决方案1】:

    我也花了几个小时解决这个问题,终于得到了这个解决方案。 您只需覆盖FrameworkInitialize() 而不是initilizeculture(), 例如:

    protected override void FrameworkInitialize()
    {
        String selectedLanguage = LanguageID;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
    
        base.FrameworkInitialize();
    }
    

    只要把这段代码放在你的ascx.cs文件中,这个覆盖函数就不需要调用了。

    【讨论】:

    • 这可能会解决我的问题。我在页面的InitualizeCulture中设置了文化,但是页面上的用户控件不尊重它。
    【解决方案2】:

    当前的文化是线程范围的:Page.CulturePage.UICulture 实际上在底层设置了 Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture

    如果在您的页面标记中定义了用户控件,我认为您无能为力。如果你用LoadControl()加载它,你可以在调用之前暂时覆盖当前线程的文化,然后再恢复它,但这会很尴尬:

    protected void Page_Load(object sender, EventArgs e)
    {
        // Some code...
    
        CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
        CultureInfo oldUICulture = Thread.CurrentThread.CurrentUICulture;
        Thread.CurrentThread.CurrentCulture = yourNewCulture;
        Thread.CurrentThread.CurrentUICulture = yourNewUICulture;
    
        try {
            Controls.Add(LoadControl("yourUserControl.ascx"));
        } finally {
            Thread.CurrentThread.CurrentCulture = oldCulture;
            Thread.CurrentThread.CurrentUICulture = oldUICulture;
        }
    
        // Some other code...
    }
    

    【讨论】:

    • 感谢您的回答 - 澄清一下:我正在通过 LoadControl 在已覆盖 InitializeCulture 的 aspx 页面上加载我的文化,不幸的是,我的用户控件仍然没有收到已设置的文化它出现的 aspx 页面。
    • @Dennis, InitializeCulture() 在页面生命周期的早期被调用,所以一切都应该在加载用户控件时设置。你在哪个阶段加载它?
    • 我在 Page_Load 期间加载它 - 有更合适的方法吗? (我只想加载一次,不需要再次加载,这就是我在页面加载时加载它的原因,并且只有在加载事件不是回发时才加载)
    • @Dennis,在Page_Load 中执行此操作很好,但由于已加载的用户控件不会保留在ViewState 中,因此您可能应该在每次请求时加载它。
    • 我已经遇到过这个问题并使用 UpdatePanel 解决了它,目前我并不关心 Control 的持久性 - 不过感谢您的周到。但是,我的 Resourceproblem 仍然存在,因为我看不到为我的控件设置文化的方法,即使它是在 aspx 页面上设置的。
    【解决方案3】:

    我使用以下代码在我的项目页面中更改了 asp.net mvc 的语言

    public ActionResult ChangeCulture (Culture lang, string returnUrl)
         {
             if (returnUrl.Length> = 3)
             {
                 returnUrl = returnUrl.Substring (3);
             }
             return redirect ("/" + lang.ToString () + returnUrl);
         }
    

    我还在同一页面上使用了 usercontrol (ascx)。当我使用 actionlink 更改语言时,viewpage 语言已更改,但用户控件页面加载事件未捕获更改,因此 viewpage 的语言更改但 usercontrol 的语言没有更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多