【问题标题】:initializeCulture of pages fires before the selectedIndexChange of dropdownlist in masterPage在 masterPage 中的下拉列表的 selectedIndexChange 之前触发页面的 initializeCulture
【发布时间】:2011-02-17 11:31:56
【问题描述】:

我有一个带有语言选择器下拉列表的母版页

它有多个使用母版页的子页面,但是在子页面中(我创建了一个 basePage 类,然后让页面继承自该类),我覆盖了 initializeCulture。 像这样:

protected override void InitializeCulture()
        {
            String selectedLanguage = Common.SessionManager.Language;

            if (selectedLanguage == "")
            {
                selectedLanguage = ConfigurationManager.AppSettings.Get("defaultLanguage");
            }

            if (selectedLanguage == "")
            {
                selectedLanguage = "nl-BE";
            }

            UICulture = selectedLanguage;
            Culture = selectedLanguage;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

            base.InitializeCulture();
        }

在下拉列表的 SelectedIndexChanged 事件中,我在会话中设置了新语言 像这样:

    protected void LanguageSelectorSelectedIndexChanged(object sender, EventArgs e)
    {
        string sCulture = LanguageSelector.SelectedValue;
        Common.SessionManager.Language = sCulture;
    }

但是 initializeCulture 已经被触发了。

所以我有一种延迟效果,页面加载以前的语言,并且在下一次回发时它的翻译正确。

我无法再次调用 initializeCulture,因为我在母版页上,并且无法访问子页面的 basePage 类。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: c# asp.net c#-4.0 internationalization event-handling


    【解决方案1】:

    您可以尝试通过表单发布值获取所选语言:

        protected override void InitializeCulture()
        {
            String selectedLanguage = Common.SessionManager.Language;
    
            if (Request.Form.ContainsKey(myLanguageDropDown.ClientID)
                selectedLanguage = Request.Form[myLanguageDropDown.ClientID];
    
            if (selectedLanguage == "")
            {
            ...
    

    【讨论】:

    • 问题是,我无法在该上下文中获取 myLanguageDropDown,因为下拉菜单位于母版页上,而此 initializeCulture 位于页面本身中(通过继承自 System.web 的 basePage .ui.Page... 所以我不能请求那个 dropdown.ClientID
    • 你可以,如果你设置 指令
    • 感谢您的想法,但它似乎仍然不起作用,我现在可以从卫星页面访问下拉列表,但它没有选择值... selectedIndex 总是-1
    • 但是,您是否尝试过使用 Request.Form 获取选定的索引?
    • 哦,该死的,我完全误读了你的帖子,我没有,我尝试获取 Master.Master.DropDownListId.SelectedIndex .... 让我立即尝试该请求表单
    【解决方案2】:

    您不能对下拉列表使用事件处理程序,因为这发生在InitializeCulture() 之后。 InitializeCulture() 发生在请求值加载到表单控件之前。

    所以从下拉列表中获取值的正确方法是不使用事件处理程序,并在InitializeCulture() 中使用Request.Form["yourddlid"] 来获取选定的值。

    【讨论】:

      【解决方案3】:

      在这种情况下,我的解决方案是在更改语言后将页面重定向到自身。

      【讨论】:

      • 如果出现任何故障,我将不得不尝试以这种方式强制刷新,是的,但我首先会寻找干净的方式 :)
      • 你在哪里看到不干净的东西?它是您的事件处理程序中的一个衬里,并且您的页面状态以自然的方式修复 - 与下一个请求。语言的变化是罕见的事件,因此额外的努力并不重要。
      • 我并不是说它很脏,但它会摇滚进行部分更新而不是整个页面刷新......正如客户已经提到的那样,他们不希望重新加载时闪烁很多...这就是为什么我说我想尝试所有选项,如果它们不起作用或证明对实施来说过于笨拙,我最终会使用刷新。但我想先看看有什么可能。
      • 以这种方式向页面添加第二次刷新并不是解决服务器不必要工作的正确解决方案
      • 添加额外的回发以解决语言切换问题并不能真正解决实际问题,并且会为服务器带来双倍的工作量。在一个小型应用程序中,这对您来说可能不是问题,但是当您拥有一个产生数千个并发用户的国家或全球网站时,这最终会影响可扩展性并增加成本,有一个适当的解决方案来解决这个问题。我出于同样的原因来到这里,寻找解决方案,正确的解决方案......不是解决方法或黑客攻击
      【解决方案4】:

      与“重定向到自身”的答案相同,您可以使用 Server.Transfer() 而不是 Redirect,从而避免往返客户端。像这样的东西(考虑它在 Default.aspx 页面中):

          protected override void InitializeCulture()
          {
              if (Session["LCID"] != null)
              {
                  int lcid = (int)Session["LCID"];
                  CultureInfo c = new CultureInfo(lcid);
                  Thread.CurrentThread.CurrentCulture = c;
              }
              base.InitializeCulture();
          }
      
          protected void comboCultures_SelectedIndexChanged(object sender, EventArgs e)
          {
              CultureInfo c = new CultureInfo(Thread.CurrentThread.CurrentCulture.LCID);
              if (comboCultures.SelectedItem != null)
                  c = CultureInfo.GetCultureInfo(Convert.ToInt32(comboCultures.SelectedItem.Value));
              Session["LCID"] = c.LCID;
              Server.Transfer("Default.aspx");
          }
      

      我已将区域性的 LCID 存储在组合框值中,但这并不重要。该技术的核心是用户 Server.Transer(pagename) 以便重新启动页面工作流,并且 Page.InitializeCulture 有机会从 Session 中获取“当前”值。

      【讨论】:

        【解决方案5】:
        protected override void InitializeCulture(){
           Page.UICulture = Request.Form["ddlLanguage"];
        } 
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 2014-06-18
        相关资源
        最近更新 更多