转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ASP.NET 2.0: 如何实现按一个按键在两种语言之间切换         ★★★★

ASP.NET 2.0: 如何实现按一个按键在两种语言之间切换

作者:闵涛 文章来源:闵涛的学习笔记 点击数:708 更新时间:2009/4/23 10:40:48
我要实现这样一个功能,就是按一个按键在两种语言(比如中文和英文)之间切换。

注:我用的是ASP.NET Beta 2。参考文章列在最后。

参考第一篇文章,"Implicit Localization Expressions"一节。一个页面(Page)的本地化内容是在FrameworkInitlize()中创建所有的控件时决定的。比如

    button1.Text = ((string)
      base.GetLocalResourceObject("LinkButtonResource1.Text"));

所以要在FrameworkInitlize()之前设置好你所需要的页面的文化(Culture).

第二篇文章"Page Lifecycle"一节列出了页面的生命周期(Lifecycle)涉及的方法。下面列出了从页面的构造函数(Constructor)开始与我的问题相关的一些方法。

    Constructor
    Construct
    TestDeviceFilter
    AddParsedSubObject
    DeterminePostBackMode
    OnPreInit
    LoadPersonalizationData
    InitializeThemes
    OnInit

在第三篇文章"The Page Lifecycle"的开头写道:

Once the HTTP page handler class is fully identified, the ASP.NET run time calls the handler''''s ProcessRequest method to process the request. ... (it) begins by calling the method FrameworkInitialize, which builds the controls tree for the page. The method is a protected and virtual member of the TemplateControl class - the class from which Page itself derives. Any dynamically generated handler for an .aspx resource overrides FrameworkInitialize. In this method, the whole control tree for the page is built.

Next, ProcessRequest makes the page transit various phases: initialization, loading of view state information and postback data, loading of the page''''s user code and execution of postback server-side events. After that, the page enters in rendering mode: the updated view state is collected; the HTML code is generated and then sent to the output console. Finally, the page is unloaded and the request is considered completely served.

从这里,我推断FrameworkInitlize()至少是在OnPreInit()之前被调用的。但是仍然看不出来FrameworkInitlize的准确位置。

绕过上面所说的这些。有两种方法可以实现上述的要求。

方法一。在某页面的InitializeCulture方法中设置你所需要的文化。比如


public partial class _Default : System.Web.UI.Page
{
    protected override void InitializeCulture()
    {
        string cul =
Session["UICulture"];
        if (!String.IsNullOrEmpty(cul))
        {
            Thread.CurrentThread.CurrentUICulture =
                new CultureInfo(
cul);
        }
    }
}

但这是针对某一个页面的。要应用到整个网站,就要多一点儿麻烦。要把这个InitializeCulture方法写在一个System.Web.UI.Page的子类中,然后让所有页面的类继承于这个子类而不是直接继承System.Web.UI.Page

方法二。在PreRequestHandlerExecute中设置你所需要的文化。参见HttpApplication类的在线帮助:
An application executes events that are handled by modules or user code that is defined in the Global.asax file in the following sequence:
   1. BeginRequest
   2. AuthenticateRequest
   3. PostAuthenticateRequest
   4. AuthorizeRequest
   5. PostAuthorizeRequest
   6. ResolveRequestCache
      An event handler (a page corresponding to the request URL) is created at this point.
   7. PostResolveRequestCache
   8. PostMapRequestHandler
   9. AcquireRequestState
  10. PostAcquireRequestState
  11. PreRequestHandlerExecute
      The event handler is executed.
  12. PostRequestHandlerExecute
  13. ...

我试过 BeginRequest, 但是不行。我想原因是因为Page.Request在此之后才被创建或赋值,所以在BeginRequest中设置的文化会被覆盖了。直到 10. PostAcquireRequestState,才被准备好,只有在此之后我们才可以设置所需要的文化。
11和12之间的 "The event handler is executed."就应该是整个页面的生命周期的处理了。方法一使用InitializeCulture就是在这里。

这样就能够达到最初的目的了。但是还有一个小问题。按键的事件处理函数只会在设置了线程的文化之后才会被执行(不论是用PreRequestHandlerExecute,抑或InitializeCulture)。 结果就是在页面的HTML传到浏览器时,所要设的文化与线程的文化不一样。而在其他的事件发生时,由于所要设的文化没有改变,就会和线程的文化一样。这样程序的行为就不一致了,容易使用户产生混淆。有一个不太完善的结局方法,就是在按键的事件处理函数最后加上下面这句,这样用户就能立刻看到改变了的语言了。

Response.Redirect(Request.Path);

缺憾是由于当前页面要重新生成,原先的状态(比如用户已经输入的东西)就不会保留了。

另外还有一个与此相关的问题,就是如何本地化sitemap(网页导航?)。请参考下面这篇文章。
ASP.NET 2.0: 在使用web.sitemap时,如何本地化网页导航(sitemap)

很抱歉,有许多术语不知道准确的中文是什么,希望大家不吝赐教。

参考文章:
  1. ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications
  2. ASP.NET 2.0 Internals
  3. The ASP.NET Page Object Model


[C语言系列]NET 中C#的switch语句的语法  [聊天工具]MSN群V2.0Beta1发布 不安装MSN群也能群聊__天极Ye…
[系统软件]托拽Explore中的文件到VB.net的窗口  [系统软件]Boost库在XP+Visual C++.net中的安装
[常用软件]新配色面板:Paint.Net3.0RC1官方下载  [常用软件]bcastr2.0 通用的图片浏览器
[常用软件]最终功能完成:Firefox 2.0 RC1推出  [常用软件]用内建的“Net Meeting”聊天
[VB.NET程序]Henry的VB.NET之旅(三)—共享成员  [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台