ASP.NET+VB多语言页面切换后跳转状态不持久问题求助
多语言网站语言切换后无法保持状态的解决方案
使用ASP.NET和Visual Basic开发多语言网站,已在母版页添加语言下拉选择框,但切换语言后跳转至其他页面时,无法保持翻译状态,每次都需重新选择语言。
现有代码
母版页前端代码
<div class="col-lg-12 text-right " style="padding-top:2%"> <asp:Label ID="Label1" runat="server" Font-Italic="True" Font-Size="Smaller" Text="Bahasa"></asp:Label> <asp:DropDownList ID="ddlLanguages" runat="server" AutoPostBack="true" OnSelectedIndexChanged = "OnSelectedIndexChanged" style="margin-right:2em" Font-Bold="True" Font-Size="Small" ForeColor="Black" Height="38px" Width="109px"> <asp:ListItem Text="English" Value="en-us" /> <asp:ListItem Text="Malay" Value="Ms" /> </asp:DropDownList> <hr /> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div>
母版页后端代码
Protected Sub OnSelectedIndexChanged(sender As Object, e As EventArgs) If Not Me.IsPostBack Then If ddlLanguages.Items.FindByValue(CultureInfo.CurrentCulture.Name) IsNot Nothing Then ddlLanguages.Items.FindByValue(CultureInfo.CurrentCulture.Name).Selected = True End If End If End Sub
页面基类代码
Imports System.Threading Imports System.Globalization Public Class BasePage Inherits System.Web.UI.Page Protected Overrides Sub InitializeCulture() Dim language As String = "en-us" 'Detect User's Language. If Request.UserLanguages IsNot Nothing Then 'Set the Language. language = Request.UserLanguages(0) End If 'Check if PostBack is caused by Language DropDownList. If Request.Form("__EVENTTARGET") IsNot Nothing AndAlso Request.Form("__EVENTTARGET").Contains("ddlLanguages") Then 'Set the Language. language = Request.Form(Request.Form("__EVENTTARGET")) End If 'Set the Culture. Thread.CurrentThread.CurrentCulture = New CultureInfo(language) Thread.CurrentThread.CurrentUICulture = New CultureInfo(language) End Sub End Class
问题原因
现有代码仅在下拉框触发PostBack时临时设置语言,但未将用户选择的语言持久化存储。跳转页面后,InitializeCulture方法会重新读取浏览器默认语言,导致之前的选择丢失。
解决方案
通过**Session(会话内持久)和Cookie(跨会话持久)**保存用户选择的语言,确保跳转页面时能读取到之前的设置。
修改后的页面基类代码
Imports System.Threading Imports System.Globalization Public Class BasePage Inherits System.Web.UI.Page Protected Overrides Sub InitializeCulture() Dim language As String = "en-us" ' 1. 优先读取Session中保存的用户选择语言(会话内有效) If Session("SelectedLanguage") IsNot Nothing Then language = Session("SelectedLanguage").ToString() ' 2. Session不存在时,读取Cookie(跨会话持久,有效期30天) ElseIf Request.Cookies("SelectedLanguage") IsNot Nothing Then language = Request.Cookies("SelectedLanguage").Value ' 3. 最后读取浏览器默认语言 ElseIf Request.UserLanguages IsNot Nothing Then language = Request.UserLanguages(0) End If ' 处理下拉框切换的PostBack请求 If Request.Form("__EVENTTARGET") IsNot Nothing AndAlso Request.Form("__EVENTTARGET").Contains("ddlLanguages") Then language = Request.Form(Request.Form("__EVENTTARGET")) ' 将选择的语言存入Session Session("SelectedLanguage") = language ' 将选择的语言存入Cookie,设置30天有效期 Dim langCookie As New HttpCookie("SelectedLanguage", language) langCookie.Expires = DateTime.Now.AddDays(30) Response.Cookies.Add(langCookie) End If ' 设置当前线程的文化信息 Thread.CurrentThread.CurrentCulture = New CultureInfo(language) Thread.CurrentThread.CurrentUICulture = New CultureInfo(language) End Sub End Class
修改后的母版页后端代码
Protected Sub OnSelectedIndexChanged(sender As Object, e As EventArgs) ' 确保下拉框选中当前生效的语言 If ddlLanguages.Items.FindByValue(CultureInfo.CurrentCulture.Name) IsNot Nothing Then ddlLanguages.Items.FindByValue(CultureInfo.CurrentCulture.Name).Selected = True End If End Sub
说明
- Session用于在当前会话内保持语言选择,关闭浏览器后失效;
- Cookie用于跨会话持久化语言选择,即使关闭浏览器再次打开,仍会保留之前的选择;
- 修改后,用户选择语言后,跳转任意页面都会自动应用该语言设置,无需重复选择。
内容的提问来源于stack exchange,提问作者wana isa
相关产品推荐
相关产品推荐

