我一定错过了一些超级基本的东西......但是尝试使用资源文件进行本地化,我只是使用此处找到的 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()