20.2 在网页中使用资源
为应用程序创建好资源文件之后,就可以在ASP.NET网页中使用这些资源文件。通常,可以使用资源来填充页上各控件的属性值,可以使用隐式本地化或显式本地化两种方法来进行设置。其中:
1)隐式本地化使用的是本地资源,并允许将控件属性自动设置为匹配的资源。
2)显式本地化允许使用资源表达式将控件属性设置为本地或全局资源文件中的特定资源。
20.2.1 隐式本地化
如果已为相关的页面创建了本地资源文件,那么现在就可以使用隐式本地化方式从该资源文件中为控件填充属性值。
在这里,需要特别注意的就是本地资源文件中的资源的命名约定,该命名约定规定必须采用“键.属性”的模式来命名。其中,“键”可以使用任意名称,但“属性”必须与要本地化的控件的某个属性名匹配,如图20-4所示。这样,ASP.NET读取资源文件并将资源与属性值相匹配。
图 20-4 编辑资源文件
在图20-4中,为本地资源文件TestY.aspx.resx添加了三个表示按钮的资源,即bt_Login.BackColor、bt_Login.Text与bt_Login.Width。
现在,就可以在TestY.aspx页面里对按钮控件的标记使用特殊的meta特性来指定隐式本地化,而不必显式指定要本地化的属性。示例如下面的代码所示:
<asp:Button ID="bt_Login"runat="server"
meta:resourcekey="bt_Login"/>
其中,resourcekey值与相应资源文件中的键相匹配。在运行时,ASP.NET通过将控件标签用做resourcekey将资源与控件属性相匹配。如果在资源文件中定义了某个属性值,则ASP.NET会用资源值替换该属性。
最后,在模板化控件(例如DataList、GridView和Wizard控件)中,可以通过父控件的隐式本地化方式来访问模板样式属性,从而本地化这些属性。但却不能够对模板本身使用隐式本地化。
20.2.2 显式本地化
在上面,已通过使用ASP.NET隐式本地化让控件显示本地化的文本。其中,生成了一个包含属性值的资源文件TestY.aspx.resx,并且在该过程中为TestY.aspx页面的按钮控件添加了一个meta特性,该特性指示控件从资源文件填充其属性值(如果有)。这样,隐式本地化会自动工作,而不需要逐个指定每个属性从资源文件读取信息的方式。
但是事实往往并非完全如此,有时可能更加需要对属性的设置方式进行更直接的控制。要达到这个目的,就不能够使用隐式本地化,而应该使用显式本地化。通过显式本地化,可以使用指向资源文件的表达式设置属性值。运行页时,会对表达式进行计算,从指定的资源文件中读取该值,然后使用该值设置属性。
其中,资源表达式的形式如下:
<%$Resources:Class, ResourceID%>
在上面的资源表达式使用中,必须要注意如下几点:
1)类((Cass)标识要在使用全局资源时使用的资源文件。它是可选的,除了资源是全局资源需要设置类之外,如果要使用本地资源文件中的资源,则无须包括类名。对于类名的设置,通常在编译.resx文件时,将不带扩展名的基文件名显式用做所得程序集的类名。
2)资源ID(ResourceID)是必需的,它是要读取的资源的标识符。
3)可以为控件自由地指定显式本地化或者隐式本地化,但不能够在一个控件里同时指定它们两种。
如下面的bt_Login控件分别从全局资源文件MyResources.resx和本地资源文件TestY.aspx.resx中采取显式本地化来指定其属性值。
<asp:Button ID="bt_Login"runat="server"
Text="<%$Resources:MyResources, bt_Login%>"
BackColor="<%$Resources:bt_Login.BackColor%>"/>
其中,“<%$Resources:MyResources, bt_Login%>”表达式获取全局资源文件MyResources.resx的bt_Login键的值;而“<%$Resources:bt_Login.BackColor%>”表达式用于获取它的本地资源文件TestY.aspx.resx的bt_Login.BackColor键的值。
20.2.3 以编程方式检索资源值
其实,除了上面使用资源表达式在标记中设置资源值外,同样还可以使用编程的方式来检索资源值。如果资源值在设计时未知,或者需要将资源值设置为在运行时获取的值,则以编程方式检索资源值是最好的办法。
如果要以编程方式来检索资源文件中的资源值,则可以通过如下两种方式来进行:
1)调用GetLocalResourceObject方法来从本地资源文件中读取特定的资源。该方法的原型如下:
protected Object GetLocalResourceObject(string resourceKey)
protected Object GetLocalResourceObject(string resourceKey,
Type objType, string propName)
其中,resourceKey参数表示资源ID;objType参数表示要获取的资源对象的类型;propName参数表示要获取的资源对象的属性名称。
在HttpContext和TemplateControl类中都提供了这些重载方法,以便于使用。使用示例如下面的代码所示:
this.bt_Login.Text=
GetLocalResourceObject("bt_Login.Text").ToString();
2)调用GetGlobalResourceObject方法从全局资源文件中读取特定的资源。该方法的原型如下:
protected Object GetGlobalResourceObject(string className,
string resourceKey)
protected Object GetGlobalResourceObject(string className,
string resourceKey, Type objType, string propName)
其中,className参数表示资源类名;resourceKey参数表示资源ID;objType参数表示资源中要获取的对象的类型;propName参数表示要获取的对象属性名称。
与GetLocalResourceObject方法一样,在HttpContext和TemplateControl类中也都提供了GetGlobalResourceObject重载方法,以便于使用。使用示例如下面的代码所示:
this.bt_Login.Text=GetGlobalResourceObject("MyResources",
"bt_Login").ToString();
除此之外,还可以使用强类型来检索全局资源。在ASP.NET中,资源将编译到命名空间Resources中,并且每个默认资源都将成为Resources类的成员。例如,上面创建了一个默认的全局资源文件MyResources.resx,并且该文件包含一个名为bt_Login的资源。现在就可以在代码里来这样引用该资源。如下面的代码示例所示:
this.bt_Login.Text=Resources.MyResources.bt_Login;