You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:45:31