在WEB应用中我们经常要创建个性化的网页什么是个性化的网页呢?举个例子大家经常使用熟悉的搜索引擎google当我们设置了每次要使用的个性化语言偏好比如使用中文后在下次使用google时则google会出现中文界面的页面十分方便在 中我们可以使用profile功能构造象上文提到的google那样的个性化网页下面我们举个例子来说明在该例子中我们建立一个日历每次用户可以选择喜欢的语言(中文英文)设置当用户选定了语言设置后则下次用户重新访问该页面时则会出现对应语言显示的页面
首先我们使用visual studio express beta 创建一个新的web站点使用语言接着往窗体添加如下控件如下图
其中分别添加如下控件一个label标签一个日历控件一个dropdownlist控件一个button控件而对于dropdownlist控件的设置采用如下方式
·Text Value 目的
·English EnUS 用英文显示网页
·Chinese ZhCN 用中文显示网页
·Auto Select Auto 根据IE浏览器中的语言设置自动选择页面显示的语言
接下来我们可以开始设置资源文件了由于我们的这个应用是一个多语言显示的页面所以要分别设置对应的英语中文资源文件在visual studio 中选择工具菜单中的Generate Local Resource(产生资源文件)如下图所示
当资源文件产生后你会发现在解决方案管理器中当前工程目录下有一个新的目录文件夹叫localresources其中defaultaspxresx这个资源文件是defaultaspx这个首页文件要用到的资源文件(我们默认defaultaspx是用英文显示)接下来右键选定defaultaspxresx文件在弹出的菜单中选择复制然后再在localresources目录下选择粘贴这样就会复制一个新的资源文件将其改名为defaultaspxzhCNresx这个将作为我们要用到的中文资源文件
接下来我们对资源文件进行编辑比如打开资源文件defaultaspxzhCNresx这时会看到如下图的资源文件我们可以对其中的中文资源文件进行编辑
在 中只需要简单在页面aspx头部的@page页增加两个新的属性Culture和UICultrue 则WEB应用程序会自动在运行时根据预先设定好的资源文件自动显示相应语言的页面如下面程序段所示
<%@ Page Language=VB
Culture=auto UICulture=auto
AutoEventWireup=false CompileWith=Defaultaspxvb
ClassName=Default_aspx meta:resourcekey=PageResource %>
为了测试程序打开IE浏览器将语言设置选定为中文运行程序则可以看到程序自动调用了中文资源文件显示出来的页面语言是中文而不是默认的英文(因为我们默认的defaultaspx是调用英文资源文件的)如下图
上面的程序中我们只是利用了资源文件的特性而已下面我们将实现让程序记住用户每次选择语言就象google那样记住用户每次的选择后下次用户在浏览页面时就会使用该语言的页面了
首先要实现这样的功能我们必须使用 中新提供的profile功能Profile可以利用数据库存储关于用户的个性化信息有点象session对象但session对象是有生存期的在生存期后session对象自动失效了而profile不同除非显式移除它要实现profile功能必须先在nfig中进行定义如下
<systemweb>
<profile>
<properties>
<add name=language type=string/>
<group name=Info>
<add name=DateSelected
type=SystemDateTime/>
<add name=LastModified
type=SystemDateTime/>
</group>
</properties>
</profile>
要使用profile属性可以这样
Profilelanguage = enUS
ProfileInfoLastModified = Now
ProfileInfoDateSelected = CalendarSelectedDate
在ngfig中将会定义一些属性/值分别存贮将要保存的变量和值比如lastmodified属性定义其值是datatime类型如此类推而<group>标签则是将一些相同或类似功能的变量值放在一起在beta 中profile是利用access数据库来保存这些值的
我们为了要让用户每次在下拉框中选择要用的语言并将其保存起来所以在提交按钮中写入如下代码
Sub btnSet_Click(ByVal sender As Object _
ByVal e As SystemEventArgs)
Profilelanguage = ddlLanguageSelectedItemValue
End Sub
而为了记录用户每次选择日历中的日期我们则利用dateselected属性来记录并且用ProfileInfoLastModified记录下用户每次选择日历中日期时的时间如下代码
Sub Calendar_SelectionChanged(ByVal sender As Object _
ByVal e As SystemEventArgs)
ProfileInfoDateSelected = CalendarSelectedDate
ProfileInfoLastModified = Now
End Sub
当页面加载时我们可以取出预先保存在profile对象中的值然后再在日历控件中显示上次用户显示的日期以及用户上次选择日期时的时间
Sub Page_Load(ByVal sender As Object _
ByVal e As SystemEventArgs) Handles MeLoad
CalendarSelectedDate = ProfileInfoDateSelected
ResponseWrite(Date set on ProfileInfoLastModified)
End Sub
而为了在每次页面加载时能根据之前用户保存在profile对象中的语言正确显示网页必须在page_preinit()事件中写入如下代码
Dim lang As SystemGlobalizationCultureInfo
读取用户在下拉框中选取的语言值
Dim selectedLang As String = Request(ddlLanguage)
如果用户选择auto则在下拉框中显示AUTO的选择项
If selectedLang = Auto Then
ddlLanguageSelectedIndex =
Exit Sub
End If
如果是POSTBACK则读取原来已经保存的语言信息
If selectedLang IsNot Nothing Then
lang = New SystemGlobalizationCultureInfo(selectedLang)
Else
如果是第一次调用页面
If Profilelanguage <> Auto Then
lang = New SystemGlobalizationCultureInfo(Profilelanguage)
Select Case Profilelanguage
Case enUS : ddlLanguageSelectedIndex =
Case zhCN : ddlLanguageSelectedIndex =
Case auto : ddlLanguageSelectedIndex =
End Select
Else
if language is auto then exit
ddlLanguageSelectedIndex =
Exit Sub
End If
End If
SystemThreadingThreadCurrentThreadCurrentCulture = lang
SystemThreadingThreadCurrentThreadCurrentUICulture = lang
lblWelcomeMessageText = ResourcesResourceWelcomeMsgToString
PageTitle = ResourcesResourcePageTitleToString
lblSelectLanguageText = ResourcesResourceSelectLanguageToString
下面来解释一下代码首先声明一个cultureinfo类型的变量这个变量将保存用户每次选择语言后的信息
接下来首先检查页面是否postback了如果postback了(发生在页面刷新或者点击了控件激发页面事件后这时用户可能重新选择一种语言了)则用下拉框中用户选择的语言去初始化cultureinfo
lang = New SystemGlobalizationCultureInfo(selectedLang)
而如果页面是第一次调用则读取原来profile对象中的语言信息并根据其是什么语言自动设置好下拉框中的对应显示(使用case语句)
最后我们设置系统的当然线程的本地化语言为设定好的lang并设置各个控件的值为资源文件中的值(以resourcesresourcexxxx形式调用)程序运行后当用户选择英文时如下图所示
当用户选择中文提交时程序运行如下图所示
当用户选择中文提交时程序运行如下图所示