【问题标题】:How can I use the URL to set the current culture in ASP.NET 2.0 Web App?如何使用 URL 设置 ASP.NET 2.0 Web App 中的当前区域性?
【发布时间】:2010-09-26 09:57:28
【问题描述】:

我正在寻找使网站基本上具有以下功能的方法:

http://mysite.com/zh-CN/index.aspx`

“en-US”可能因文化而异。

然后,URL 中的这种文化将基本上为应用程序设置CurrentUICulture..

基本上,我们目前有一个用户明确点击它的页面,但有些人喜欢过去,这会导致一些问题..

我知道这种事情在 ASP.NET MVC 中很容易完成,但是我们这些仍在 2.0 中工作的人呢?你们能提供任何可以让我开始的建议/指针/任何东西吗?这对我来说是新的:)

我确定必须有某种方法来接收请求并酌情设置/退回。HttpModule 也许?

更新

刚刚想到.. 最好在 IIS 中创建 VirtDirs,然后从请求的 URL 中提取适当的部分并在 InitializeCulture 中设置文化?

【问题讨论】:

  • AFAIK,VirtDirs 的问题是它们不共享 Session 对象并且难以测试。
  • 只有将 VirtDirs 设置为在自己的应用程序池中运行时才会出现这种情况 - 如果它们都在同一个池中,则会话应该没问题。

标签: asp.net localization url-rewriting asp.net-2.0 url-routing


【解决方案1】:

尝试添加该参数

http://yoursite/yourPage.aspx?lang=en-US

如果您使用资源文件,它将自动运行。

祝你好运

【讨论】:

    【解决方案2】:

    将选项存储在 cookie 中是不可能的吗? 很高兴为用户提供选择,但为什么不直接使用用户客户端/网络浏览器设置?

    如果他们为页面添加了书签并且丢失了 cookie,您可以回退到默认设置,如果这是您不支持的文化,则进一步回退到 en-US。

    如果您想保留您的解决方案,您可以使用重写引擎。我过去使用过http://www.managedfusion.com/products/url-rewriter/。引擎列表见http://en.wikipedia.org/wiki/Rewrite_engine#IIS

    【讨论】:

      【解决方案3】:

      我在一些使用 ASP.net Routing 的站点中这样做。

      代码如下:

      Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
          ' Code that runs on application startup
          RegisterRoutes(RouteTable.Routes)
      End Sub
      
      
      Public Sub RegisterRoutes(ByVal routes As RouteCollection)
          Dim reportRoute As Route
          Dim DefaultLang As String = "es"
      
          reportRoute = New Route("{lang}/{page}", New LangRouteHandler)
          '* if you want, you can contrain the values
          'reportRoute.Constraints = New RouteValueDictionary(New With {.lang = "[a-z]{2}"})
          reportRoute.Defaults = New RouteValueDictionary(New With {.lang = DefaultLang, .page = "home"})
      
          routes.Add(reportRoute)
      End Sub
      

      然后是 LangRouteHandler.vb 类:

      Public Class LangRouteHandler
           Implements IRouteHandler
      
        Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler _
            Implements System.Web.Routing.IRouteHandler.GetHttpHandler
      
          'Fill the context with the route data, just in case some page needs it
          For Each value In requestContext.RouteData.Values
              HttpContext.Current.Items(value.Key) = value.Value
          Next
      
          Dim VirtualPath As String
          VirtualPath = "~/" + requestContext.RouteData.Values("page") + ".aspx"
      
          Dim redirectPage As IHttpHandler
          redirectPage = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, GetType(Page))
          Return redirectPage
      
        End Function
      End Class
      

      最后我使用根目录中的 default.aspx 重定向到浏览器列表中使用的默认语言。
      也许这可以通过 route.Defaults 完成,但不能在 Visual Studio 中工作(也许它可以在服务器中工作)

      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
          Dim DefaultLang As String = "es"
          Dim SupportedLangs As String() = {"en", "es"}
          Dim BrowserLang As String = Mid(Request.UserLanguages(0).ToString(), 1, 2).ToLower
          If SupportedLangs.Contains(BrowserLang) Then DefaultLang = BrowserLang
      
          Response.Redirect(DefaultLang + "/")
      End Sub
      

      一些来源:
      * Mike Ormond's blog
      * Chris Cavanagh’s Blog
      * MSDN

      【讨论】:

        【解决方案4】:

        您可以通过 Web 表单轻松使用为 MVC 开发的路由功能。这个 SO 问题解决了这样做的问题:

        ASP.NET Routing with Web Forms

        如果您不能使用 3.5 框架,则有许多 URL 重写模块。我没有任何经验可以提出建议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 2020-10-07
          • 2010-12-05
          • 2019-10-04
          • 1970-01-01
          • 2021-11-22
          相关资源
          最近更新 更多