同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁 優(yōu)化推廣 ASP.NET前臺(tái)代碼綁定后臺(tái)變量方法總結(jié)

ASP.NET前臺(tái)代碼綁定后臺(tái)變量方法總結(jié)

來源: | 時(shí)間:2011/3/29 10:16:38 |

經(jīng)常會(huì)碰到在前臺(tái)代碼中要使用(或綁定)后臺(tái)代碼中變量值的問題。一般有<%= str%>和<%# str %>兩種方式,這里簡單總結(jié)一下。如有錯(cuò)誤或異議之處,敬請(qǐng)各位指教。

    一方面,這里所講的前臺(tái)即通常的.aspx文件,后臺(tái)指的是與aspx相關(guān)聯(lián)的CodeBehind,文件后綴名為.aspx.cs;另一方面,這里的綁定是指用戶發(fā)出訪問某一頁面指令后,服務(wù)器端在執(zhí)行過程中就已經(jīng)將前臺(tái)代碼進(jìn)行了賦值,而后生成html格式回傳客戶端顯示,而并非已經(jīng)顯示到客戶端后,然后通過其他方法(如ajax)去服務(wù)器端獲取相應(yīng)變量。

備注:上面說的兩個(gè)文件是常見的代碼隱藏(code-behind)模式,還有一種是代碼嵌入(code-beside, inline)模式,那就是只存在aspx一個(gè)文件,而后臺(tái)代碼則寫入此文件的<script type="text/javascript" runat="server"></script>之中(還有一些語法上區(qū)別),這對(duì)于本文討論的問題略有影響,因?yàn)榇a嵌入是聲明性代碼與C#/VB.NET代碼都一起編譯到一個(gè)類里面,而代碼隱藏則將聲明性代碼與C#/VB.NET代碼分開幾次進(jìn)行翻譯/編譯,因此前者是局部與局部(partial)的關(guān)系后者基類與派生類的關(guān)系,但這僅僅影響所能綁定變量的范圍(與修飾符有關(guān)),下面會(huì)提到。以下均以代碼隱藏模式為例。

    一般來說,在前臺(tái)代碼的三種位置可能會(huì)用到(綁定)后臺(tái)變量:

  • 服務(wù)器端控件屬性或HTML標(biāo)簽屬性
  • JavaScript代碼中
  • Html顯示內(nèi)容的位置(也就是開始標(biāo)簽與結(jié)束標(biāo)簽之間的內(nèi)容,如<div>這里</div>(Html標(biāo)簽)或者<asp:Label ID="Label2" runat="server" Text="Label">這里</asp:Label>(服務(wù)器端控件),它作為占位符把變量顯示于符號(hào)出現(xiàn)的位置)

    對(duì)于第一種位置,有一些約束條件:

    (1)一般的屬性要求是字符串型或數(shù)值型(下面會(huì)提到有些服務(wù)器端屬性支持屬性為數(shù)據(jù)集合);

    (2)并不是所有的屬性都可以綁定變量,有些屬性例如runat屬性必須是"server"常量,即使綁定的字符串是server,也會(huì)導(dǎo)致分析器分析時(shí)出錯(cuò);

    (3)有一種屬性,他要求屬性值有約束(類型約束,比如服務(wù)器端控件要求TabIndex屬性是short類型,或者字符串內(nèi)容有約束),也應(yīng)該在綁定時(shí)滿足,否則依然可能編譯時(shí)報(bào)錯(cuò);

    (4)還一種屬性,雖然屬性本身有約束,但即使綁定的變量不滿足約束,也可以編譯通過,比如input的checked屬性,它只有checked字符串是合法的,但如果通過綁定獲取到的字符串不是checked,那么這些屬性將有自己內(nèi)部處理機(jī)制,來保證可以正常使用;

    (5)還要注意,即使對(duì)于同一類屬性,服務(wù)器端和HTML的屬性的處理機(jī)制也不同,同樣是TabIndex(tabIndex),前者如果不滿足,則分析器錯(cuò)誤,后者則忽略這一問題。

    對(duì)于第二種位置,一般只要綁定的后臺(tái)變量和JavaScript中數(shù)據(jù)類型兼容即可。

    對(duì)于第三種位置,如果綁定出現(xiàn)的位置不在服務(wù)器端控件內(nèi)部,則沒有約束條件,只要是常量字符串可以出現(xiàn)的位置,均可以綁定。但是對(duì)于置于服務(wù)器端控件內(nèi)部,也就是上面那種<asp:Label ID="Label2" runat="server" Text="Label">這里</asp:Label>的方式,則有約束條件。通過總結(jié),歸納為四類服務(wù)器端控件,如果綁定的代碼出現(xiàn)在這些控件的開始和結(jié)束標(biāo)簽之間(這里所說的控件,是指如果綁定代碼外有多層的嵌套控件包圍,則是指包圍綁定代碼的最內(nèi)層控件),有不同的顯示結(jié)果:

    (1)約束型控件:這類控件要求它的開始標(biāo)簽和結(jié)束標(biāo)簽中只能包含指定的子控件,因此如果在這里出現(xiàn)代碼塊,將編譯錯(cuò)誤。例如:

<asp:DataList runat="server"></asp:DataList>,在它之間,要求必須嵌套<ItemTemplate></ItemTemplate>。

    (2)非嵌套類控件:這類控件,不允許在內(nèi)部嵌套其他控件或標(biāo)簽,只能是常量字符串,它會(huì)將開始標(biāo)簽和結(jié)束標(biāo)簽中常量字符串內(nèi)容作為他的屬性。例如上面提到的TextBox,它會(huì)將標(biāo)簽間內(nèi)容作為它的Text屬性值。

  (3)嵌套類控件:這類控件,可以嵌套其他任意控件,也可以包含字符串,因此可以正常顯示綁定代碼塊所表示的字符串內(nèi)容。例如Label控件、Panel等。

  (4)數(shù)據(jù)綁定類控件:這類控件是ASP.NET提供的服務(wù)器端控件,除了可以綁定普通的變量類型,也可以綁定一個(gè)數(shù)據(jù)集合(只能采取下面的第二種方式實(shí)現(xiàn))。

    關(guān)于是否加引號(hào):在以上三個(gè)位置使用時(shí),是否應(yīng)該將<%= str%>或<%# str %>置于單引號(hào)或雙引號(hào)中呢?對(duì)于在不同位置,處理的方式是不同的:(具體請(qǐng)?jiān)谙旅鎯煞N方式的具體介紹時(shí),加以體會(huì))

    (1)對(duì)于第一種位置,由于JavaScript是弱類型的,如果綁定時(shí)加引號(hào),顯然就認(rèn)為就當(dāng)做字符串來處理,這始終是正確的;如果綁定時(shí)不加引號(hào),它將認(rèn)為這是個(gè)數(shù)值型的,那么如果獲取的真是數(shù)值,當(dāng)然可以,如果是非數(shù)值型,則將產(chǎn)生腳本錯(cuò)誤,這即使對(duì)于JavaScript賦值常量時(shí),也是同樣的:

 
1 var test1 = 123b;//運(yùn)行時(shí)報(bào)錯(cuò)
2  var test2=123;//正確,是數(shù)值型
3  var test3="123b";//正確,字符串型

 

    (2)對(duì)于第二種位置,經(jīng)過測試,無論是對(duì)于服務(wù)器端控件屬性還是HTML標(biāo)簽屬性,加引號(hào)總是正確的;如果不加引號(hào),則兩種屬性的處理方式不同:

  • 對(duì)于服務(wù)器端控件屬性,如果綁定的代碼塊不加引號(hào),則編譯時(shí)會(huì)提示“驗(yàn)證(ASP.NET):特性值前后必須加引號(hào)”的警告信息,但是生成為HTML后,對(duì)應(yīng)生成的HTML屬性已經(jīng)被加上引號(hào)并獲取了正確的綁定結(jié)果,因此加不加引號(hào)不會(huì)影響使用,但是建議對(duì)于規(guī)范的代碼,還是加上為好;
  • 對(duì)于HTML標(biāo)簽屬性,如果不加引號(hào),則編譯時(shí)會(huì)提示“驗(yàn)證(XHTML 1.0 Transitional): 特性值前后必須加引號(hào)”的警告信息,并且生成為HTML屬性也確實(shí)沒有加上引號(hào),那么雖然屬性后面確實(shí)是沒有加上引號(hào)的正確的綁定值,但是不一定能展示出想要看到的結(jié)果。比如對(duì)于input標(biāo)簽的value屬性,如果綁定的字符串是"    hello world from variable”,則在客戶端的input顯示出的內(nèi)容實(shí)際上只是"hello”字符串,生效的屬性值是一個(gè)被截?cái)嗟淖址?,它從屬性后的一串字符串(若未加引?hào))的第一個(gè)非空字符開始,截止到下一個(gè)空字符的前一個(gè)字符為止(比如對(duì)于"      hello world”,結(jié)果將是"hello”),因此,加上引號(hào)是必須的。

    (3)對(duì)于第三種位置,加與不加引號(hào),獲取的值及其顯示均不受影響。

    因此建議,所有綁定表達(dá)式都加上引號(hào),作為字符串獲取,然后根據(jù)實(shí)際需求,用相應(yīng)函數(shù)進(jìn)行轉(zhuǎn)換,得到所需要的類型。

    另外,這里所說的后臺(tái)變量是泛指的,包括如下:

    <

服務(wù)熱線

153 8323 9821

功能和特性

價(jià)格和優(yōu)惠

網(wǎng)站和維護(hù)

推廣和優(yōu)化

微信服務(wù)號(hào)