2013-06-21 32 views
1

我必須失去了一些東西超級基本...但試圖使用資源文件做本地化,我簡單地使用MSDN例如發現here:ASP.Net本地化InitializeCulture控制總是空

在後面的代碼我頁:

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而不是名稱。一旦我徹底解決後會發佈。

編輯2: 在這裏,我們去。這有點冒險,只能用,因爲這個頁面沒有很多參數。如果有人知道更優雅的解決方案,我會非常感激!

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() 

回答

1

我不太確定這是否對您有所幫助,因爲答案很晚。

的解決方案如下:

  1. 獲取控制
  2. 使用PageMethods(或jQuery的AJAX)調用的唯一ID傳遞到服務器端
  3. 店鋪的ID在一個靜態的UniqueID可變
  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(); 
    } 

我希望這有助於。

問候,

薩馬

+0

這是一個非常好的解決方案。但它取決於JavaScript,這意味着使用該網站的用戶必須啓用JavaScript。儘管如此,似乎它會工作。謝謝! – user158017

+0

我實際上並沒有使用它。我仍在使用我的解決方案,因爲它不依賴於JavaScript。所以我沒有把它作爲答案。但我會給你代表並檢查它。 – user158017