如何使用URL在ASP.NET 2.0 Web App中设置当前文化?

时间:2008-12-11 10:39:10

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

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

http://mysite.com/的en-US / index.aspx`

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

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

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

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

我确信必须有某种方式来接收请求并根据需要设置/退回.. HttpModule可能吗?

更新

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

4 个答案:

答案 0 :(得分:3)

是否将选项存储在cookie中? 很高兴为用户提供选择,但为什么不默认用户客户端/ Web浏览器设置?

如果他们为某个网页添加书签并丢失了该Cookie,则可能会退回到默认状态,如果这是一种您不支持的文化,则可以进一步退回到en-US。

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

答案 1 :(得分:1)

您可以使用webforms轻松使用为MVC开发的路由功能。这个问题解决了这个问题:

ASP.NET Routing with Web Forms

如果你不能使用3.5框架,那里有很多URL重写模块。我没有任何能够提出建议的经验。

答案 2 :(得分:1)

我在一些使用ASP.net路由的网站上这样做。

以下是代码:

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

最后,我使用root中的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

答案 3 :(得分:0)

尝试添加该参数

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

如果您正在使用资源文件,它将自动生效。

祝你好运

豫ICP备18024241号-1