它是ASP.NET2.0新增了一種聲明性表達式語(yǔ)法,可在分析頁(yè)之前將值替換到頁(yè)中. ASP.NET表達式是基于運行時(shí)計算的信息設置控件屬性的一種聲明性方式. ASP.NET表達式主要應用在:連接字符串,應用程序設置,資源文件等地方.
1.首先得先了解下面的知識:
了解一個(gè)名詞:表達式語(yǔ)法
表達式語(yǔ)法格式:<%$ ... %>
它是ASP.NET2.0新增了一種聲明性表達式語(yǔ)法,可在分析頁(yè)之前將值替換到頁(yè)中.
ASP.NET表達式是基于運行時(shí)計算的信息設置控件屬性的一種聲明性方式.
ASP.NET表達式主要應用在:連接字符串,應用程序設置,資源文件等地方.
ASP.NET 表達式的基本語(yǔ)法如下:
<%$ expressionPrefix: expressionValue %>
下面演示表達式語(yǔ)法在連接字符串和應用程序設置的應用:
a.表達式語(yǔ)法在連接字符串的應用
將存儲在Web.config文件中的連接字符串的值設置為控件的連接字符串屬性
<ASP:SqlDataSource ID="SqlDataSource1" Runat="server"
SelectCommand="SELECT * FROM Employees"
ConnectionString="<%$ ConnectionStrings:NorthwindCon %>">
</asp:SqlDataSource>
<configuration>
<connectionStrings>
<add name="NorthwindCon"
connectionString="Data Source=yanfa0;Integrated Security=SSPI;Initial Ctalog=Northwind;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
b.表達式語(yǔ)法在應用程序設置的應用
使用表達式來(lái)引用在Web.config配置文件中定義的應用程序設置
<asp:Label ID="Label1" runat="server" Text="<%$ AppSettings:Txt %>"></asp:Label>
<appSettings>
<add key="Txt" value="Abc"/>
</appSettings>
其實(shí)表達式語(yǔ)法還有一個(gè)重要的應用,就是在資源文件中的使用,而資源文件正是我實(shí)現本地化的基礎.
區域性的格式設置
區域性名稱(chēng)和標識符名稱(chēng)遵循RFC 1766標準,具體請查看msdn
請看下圖,抓取的部分區域性圖片:

區域性通常分為三個(gè)類(lèi)型:固定區域性、非特定區域性和特定區域性。
a.固定區域性不區分區域性??梢允褂每兆址?"")或者按區域性標識符0x007F來(lái)指定固定區域性,它與英語(yǔ)語(yǔ)言關(guān)聯(lián),但不與任何國家/地區關(guān)聯(lián)。
b.非特定區域性是與某種語(yǔ)言關(guān)聯(lián)但不與國家/地區關(guān)聯(lián)的區域性。
c.特定區域性是與某種語(yǔ)言和某個(gè)國家/地區關(guān)聯(lián)的區域性。
例如:"fr"(法語(yǔ))是非特定區域性,而"fr-FR"(法語(yǔ)(法國))是特定區域性
特別提示:"zh-CHS"(簡(jiǎn)體中文)和"zh-CHT"(繁體中文)是非特定區域性。
區域性是有層次結構的,即特定區域性的父級是非特定區域性,而非特定區域性的父級是InvariantCulture
利用ASP.NET2.0可輕松地逐頁(yè)更改區域性設置
只需將UICulture和Culture(區域性)屬性添加到.ASPx等類(lèi)似頁(yè)面內的Page指令即可
<%@ Page Culture="Auto" UICulture="Auto" %>
要想對站點(diǎn)中的所有頁(yè)面都設置相同的區域性設置,只需將以下元素添加到位于站點(diǎn)的根處的web.config文件中即可,這樣就不必分別為每個(gè)頁(yè)面進(jìn)行分配了
<globalization uiCulture="auto" culture="auto" />
還可以為ASP.NET指定一個(gè)默認區域性
以下指定頁(yè)面的用戶(hù)界面區域性是自動(dòng),默認區域性是英語(yǔ),頁(yè)的區域性是自動(dòng),默認區域性是英語(yǔ)(美國)
<globalization uiCulture="auto:en" culture="auto:en-US" />
Culture:指示頁(yè)的區域性設置
UICulture:指定用于頁(yè)的用戶(hù)界面(UI)區域性設置
B.設置語(yǔ)言首選項
自動(dòng)檢測功能所選擇的默認Culture和UICulture有時(shí)可能不是用戶(hù)所需要的
例如:一個(gè)美國籍業(yè)務(wù)員來(lái)到中國出差,在中國總部上網(wǎng)下業(yè)務(wù)單.這種情況下,Web應用程序應該為用戶(hù)提供顯式更改語(yǔ)言的功能,給他提供英文版的業(yè)務(wù)下單頁(yè)
using System.Threading;
using System.Globalization;
protected override void InitializeCulture ( )
{
//顯式的指定區域為en,為美國籍業(yè)務(wù)員顯示英文頁(yè)
//實(shí)際應用中可以根據用戶(hù)選擇來(lái)動(dòng)態(tài)設置語(yǔ)言
//還可以利用Profile來(lái)記住用戶(hù)選擇的語(yǔ)言,以便用戶(hù)以后訪(fǎng)問(wèn)網(wǎng)站時(shí)自動(dòng)進(jìn)入相應語(yǔ)言頁(yè)
Thread.CurrentThread.CurrentUICulture = new CultureInfo ( "en" );
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ( "en-US" );
}
注意:對Thread.CurrentThread.CurrentCulture和 Thread.CurrentThread.CurrentUICulture所做的更改需要在InitializeCulture()方法中進(jìn)行,因為 對首選瀏覽器語(yǔ)言的自動(dòng)檢測是在頁(yè)生存期的早期發(fā)生的
特別提示:
CultureInfo類(lèi)的實(shí)例化一般有兩個(gè)途徑,如下所示:
CultureInfo culture = CultureInfo. CreateSpecificCulture (name);
CultureInfo culture = new CultureInfo(name);
二者的區分:
使用第一種方法,只能創(chuàng )建固定區域性或特定區域性的CultureInfo實(shí)例。
使用第二種方法,則是建立一個(gè)name所指定的區域性的CultureInfo實(shí)例,它可以是固定的,非特定的或特定區域性的
Thread類(lèi)的CurrentCulture屬性用來(lái)獲取或配置當前線(xiàn)程的區域性,它必須被配置為特定區域性。
假如Thread.CurrentThread.CurrentCulture = new CultureInfo ( "en" );就會(huì )報錯!
2.多語(yǔ)言的實(shí)現
其實(shí)實(shí)現是比較簡(jiǎn)單的,只需要下面幾個(gè)步驟
1.創(chuàng )建全局資源表
2.在session中存放表示當前的culture的變量,如“en-us”,"zh-cn"
3.創(chuàng )建所有頁(yè)面的基類(lèi)PageBase,覆蓋InitializeCulture函數
4.頁(yè)面上的文本值, 表達式語(yǔ)法賦值
添加兩個(gè)全局資源表
Strings.resx和Strings.en-us.resx(注意-后面的字符要符合RFC 1766標準,沒(méi)帶后綴的話(huà)就是默認值)
如下圖:
PageBase
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Web;
5using System.Globalization;
6/// <summary>
7/// Summary description for PageBase
8/// </summary>
9public class PageBase:System.Web.UI.Page
10{
11 public PageBase()
12 {
13 //
14 // TODO: Add constructor logic here
15 //
16 }
17 protected override void InitializeCulture()
18 {
19 string currentCulture = (string)Session["Culture"];
20 if (string.IsNullOrEmpty(currentCulture))
21 {
22 currentCulture = "zh-cn";
23 Session["Culture"] = "zh-cn";
24 }
25
26 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(currentCulture);
27 System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(currentCulture);
28
29 }
30}
31
基本頁(yè)面:
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Web;
5using System.Web.UI;
6using System.Web.UI.WebControls;
7using System.Globalization;
8public partial class _Default :PageBase
9{
10 protected void Page_Load(object sender, EventArgs e)
11 {
12
13 }
14 protected void btnChinese_Click(object sender, EventArgs e)
15 {
16 Session["Culture"] = "zh-cn";
17/////可以嘗試注釋下面這句出現的效果
18 this.RegisterClientScriptBlock("reload", "<script>window.location=window.self.location;</script>");
19 }
20 protected void btnEnglish_Click(object sender, EventArgs e)
21 {
22 Session["Culture"] = "en-us";
23/////可以嘗試注釋下面這句出現的效果
24 this.RegisterClientScriptBlock("reload", "<script>window.location=window.self.location;</script>");
25 }
26}
27
簡(jiǎn)單的一個(gè)多語(yǔ)言的例子
缺點(diǎn):切換語(yǔ)言時(shí)需要load兩次
建議:可以利用ajax請求修改完session值后在執行window.location=window.self.location;
如:
1 function PageRefresh(language)
2 {
3 //使用JQUERY做ajax的請求
4 try
5 {
6
7 var virthPath="http://localhost/MulitLanguage“;
8
9
10 $.ajax({
11 type: "POST",
12 url: virthPath+"/AjaxHandler.ashx",///AjaxHandler.ashx中改變session值
13 success: function(msg){
14 ChangeLanguage_Rslt(msg);
15 }
16 });
17
18
19 }
20 catch(e)
21 {
22 alert('Error');
23 }
24
25
26 }
27
28 function ChangeLanguage_Rslt(data)
29 {
30 if(data=="OK")
31 window.location=window.self.location;
32
33 }
34 else
35 {
36 alert(data);
37 }
38 }