2

我一定错过了一些超级基本的东西......但是尝试使用资源文件进行本地化,我只是使用此处找到的 MSDN 示例:

在我的页面后面的代码上:

  Protected Overrides Sub InitializeCulture()
        If Request.Form("listLanguages") IsNot Nothing Then
            Dim selectedLanguage As String = _
                Request.Form("listLanguages")
            UICulture = Request.Form("listLanguages")
            Culture = Request.Form("listLanguages")
            Thread.CurrentThread.CurrentCulture = _
                CultureInfo.CreateSpecificCulture(selectedLanguage)
            Thread.CurrentThread.CurrentUICulture = New  _
                CultureInfo(selectedLanguage)
        End If
        MyBase.InitializeCulture()
    End Sub

在我的标记中:

    <form id="form1" runat="server" defaultbutton="btnStart"  autocomplete="off" >
                   <asp:Label ID="lblLanguageChoice" AssociatedcontrolID="listLanguages" runat="server" Text="Language Options"></asp:Label>
                   <asp:ListBox ID="listLanguages" runat="server">
                       <asp:ListItem Value="en"  Selected="True" Text="English"></asp:ListItem>
                       <asp:ListItem Value="es" Text="Español"></asp:ListItem>
                   </asp:ListBox>
                   <asp:Button ID="btnChangeLanguage" runat="server" 
                    Text="Change Language" />
.......

但是当单步执行代码时(在选择语言并点击按钮之后),列表框总是“什么都没有”——考虑到这个事件在页面循环中的触发时间有多早,这是有道理的。

我怎样才能让这个例程知道我的语言选择?我尝试在按钮单击时将所做的选择填充到会话变量中,但后来我是“点击后面”。(单击一次,它会保存语言选择但保持默认语言。单击两次,它会切换到所选语言。)我需要一个在单击按钮时刷新并且不需要用户点击它的解决方案两次。

编辑: 我找到了原因 - 现在我只需要弄清楚如何解决它!这就是疯狂的 ASP 命名约定。我的列表框未命名为“listLanguages”。单步执行它原来被命名为“ctl00$MainContent$listLanguages”。ClientIDMode static 无法解决它,因为它更改了 id 而不是名称。一旦我完全解决将发布。

EDIT2: 我们开始吧。这有点骇人听闻,只有在此页面上没有很多参数时才有效。如果有人知道更优雅的解决方案,我将不胜感激!

  Dim request As HttpRequest = Me.Request
        Dim params As NameValueCollection = request.Form
        For Each par As String In params.AllKeys
            If par.Contains("listLanguages") Then
                Dim selectedLanguage As String = request(par)
                UICulture = request(par)
                Culture = request(par)
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage)
                Thread.CurrentThread.CurrentUICulture = New CultureInfo(selectedLanguage)
            End If
        Next

        MyBase.InitializeCulture()
4

1 回答 1

2

我不太确定这是否对您有帮助,因为答案很晚。

解决方案如下:

  1. 获取控件的 UniqueID
  2. 使用 PageMethods(或 jquery ajax)调用将唯一 id 传递给服务器端
  3. 将 id 存储在静态变量中
  4. 在“InitializeCulture”方法中使用此静态变量

以下是每个步骤的代码。我使用了 DropDownList 而不是 ListBox 但这不重要。代码也在 C# 中,但将其转换为 VB.NET 不应该是一个挑战。

对于第 1 步和第 2 步:

启用页面方法为

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> </asp:ScriptManager>

使用“PageMethods”在后面的代码上调用方法

$("document").ready(function () { PageMethods.SendForm('<%= DropDownList1.UniqueID %>', OnSucceeded, OnFailed); });

对于第 3 步:

    static string dropDownUniqueID;

    [System.Web.Services.WebMethod]
    public static void SendForm(string uniqueID)
    {
        dropDownUniqueID = uniqueID;
    }

对于第 4 步:

    protected override void InitializeCulture()
    {
        if (Request.Form[dropDownUniqueID] != null)
        {
            UICulture = Request.Form[dropDownUniqueID];
            Culture = Request.Form[dropDownUniqueID];
        }

        //This is not working
        //if (Request.Form["DropDownList1"] != null)
        //{
        //    UICulture = Request.Form["DropDownList1"];
        //    Culture = Request.Form["DropDownList1"];
        //}

        //This is your solution
        //foreach (string item in Request.Form)
        //{
        //    if (item.Contains("DropDownList1"))
        //    {
        //        UICulture = Request.Form[item];
        //        Culture = Request.Form[item];
        //    }
        //}

        base.InitializeCulture();
    }

我希望这有帮助。

问候,

萨马尔

于 2013-09-25T13:11:55.783 回答