服務熱線
153 8323 9821
經常會碰到在前臺代碼中要使用(或綁定)后臺代碼中變量值的問題。一般有<%= str%>和<%# str %>兩種方式,這里簡單總結一下。如有錯誤或異議之處,敬請各位指教。
一方面,這里所講的前臺即通常的.aspx文件,后臺指的是與aspx相關聯的CodeBehind,文件后綴名為.aspx.cs;另一方面,這里的綁定是指用戶發出訪問某一頁面指令后,服務器端在執行過程中就已經將前臺代碼進行了賦值,而后生成html格式回傳客戶端顯示,而并非已經顯示到客戶端后,然后通過其他方法(如ajax)去服務器端獲取相應變量。
備注:上面說的兩個文件是常見的代碼隱藏(code-behind)模式,還有一種是代碼嵌入(code-beside, inline)模式,那就是只存在aspx一個文件,而后臺代碼則寫入此文件的<script type="text/javascript" runat="server"></script>之中(還有一些語法上區別),這對于本文討論的問題略有影響,因為代碼嵌入是聲明性代碼與C#/VB.NET代碼都一起編譯到一個類里面,而代碼隱藏則將聲明性代碼與C#/VB.NET代碼分開幾次進行翻譯/編譯,因此前者是局部與局部(partial)的關系后者基類與派生類的關系,但這僅僅影響所能綁定變量的范圍(與修飾符有關),下面會提到。以下均以代碼隱藏模式為例。
一般來說,在前臺代碼的三種位置可能會用到(綁定)后臺變量:
對于第一種位置,有一些約束條件:
(1)一般的屬性要求是字符串型或數值型(下面會提到有些服務器端屬性支持屬性為數據集合);
(2)并不是所有的屬性都可以綁定變量,有些屬性例如runat屬性必須是"server"常量,即使綁定的字符串是server,也會導致分析器分析時出錯;
(3)有一種屬性,他要求屬性值有約束(類型約束,比如服務器端控件要求TabIndex屬性是short類型,或者字符串內容有約束),也應該在綁定時滿足,否則依然可能編譯時報錯;
(4)還一種屬性,雖然屬性本身有約束,但即使綁定的變量不滿足約束,也可以編譯通過,比如input的checked屬性,它只有checked字符串是合法的,但如果通過綁定獲取到的字符串不是checked,那么這些屬性將有自己內部處理機制,來保證可以正常使用;
(5)還要注意,即使對于同一類屬性,服務器端和HTML的屬性的處理機制也不同,同樣是TabIndex(tabIndex),前者如果不滿足,則分析器錯誤,后者則忽略這一問題。
對于第二種位置,一般只要綁定的后臺變量和JavaScript中數據類型兼容即可。
對于第三種位置,如果綁定出現的位置不在服務器端控件內部,則沒有約束條件,只要是常量字符串可以出現的位置,均可以綁定。但是對于置于服務器端控件內部,也就是上面那種<asp:Label ID="Label2" runat="server" Text="Label">這里</asp:Label>的方式,則有約束條件。通過總結,歸納為四類服務器端控件,如果綁定的代碼出現在這些控件的開始和結束標簽之間(這里所說的控件,是指如果綁定代碼外有多層的嵌套控件包圍,則是指包圍綁定代碼的最內層控件),有不同的顯示結果:
(1)約束型控件:這類控件要求它的開始標簽和結束標簽中只能包含指定的子控件,因此如果在這里出現代碼塊,將編譯錯誤。例如:
<asp:DataList runat="server"></asp:DataList>,在它之間,要求必須嵌套<ItemTemplate></ItemTemplate>。
(2)非嵌套類控件:這類控件,不允許在內部嵌套其他控件或標簽,只能是常量字符串,它會將開始標簽和結束標簽中常量字符串內容作為他的屬性。例如上面提到的TextBox,它會將標簽間內容作為它的Text屬性值。
(3)嵌套類控件:這類控件,可以嵌套其他任意控件,也可以包含字符串,因此可以正常顯示綁定代碼塊所表示的字符串內容。例如Label控件、Panel等。
(4)數據綁定類控件:這類控件是ASP.NET提供的服務器端控件,除了可以綁定普通的變量類型,也可以綁定一個數據集合(只能采取下面的第二種方式實現)。
關于是否加引號:在以上三個位置使用時,是否應該將<%= str%>或<%# str %>置于單引號或雙引號中呢?對于在不同位置,處理的方式是不同的:(具體請在下面兩種方式的具體介紹時,加以體會)
(1)對于第一種位置,由于JavaScript是弱類型的,如果綁定時加引號,顯然就認為就當做字符串來處理,這始終是正確的;如果綁定時不加引號,它將認為這是個數值型的,那么如果獲取的真是數值,當然可以,如果是非數值型,則將產生腳本錯誤,這即使對于JavaScript賦值常量時,也是同樣的:
1 |
var test1 = 123b;//運行時報錯 |
2 |
var test2=123;//正確,是數值型 |
3 |
var test3="123b";//正確,字符串型 |
(2)對于第二種位置,經過測試,無論是對于服務器端控件屬性還是HTML標簽屬性,加引號總是正確的;如果不加引號,則兩種屬性的處理方式不同:
(3)對于第三種位置,加與不加引號,獲取的值及其顯示均不受影響。
因此建議,所有綁定表達式都加上引號,作為字符串獲取,然后根據實際需求,用相應函數進行轉換,得到所需要的類型。
另外,這里所說的后臺變量是泛指的,包括如下: