HtmlControl在是否runat=server,使用單引雙引號有不同的結果,有時因為需要而增加或移除runat=server,我的網頁就掛了,而且一堆單引雙引號常搞的自己灰掉,所以想找出通用做法,可以在二個狀態間共用,後來發現還滿簡單的,使用Escape就可以了。
記得當初寫ASP.NET時為了資料繫結大傷腦筋,如
範例一
正常
範例二
加上runat=server
失敗 -剖析器錯誤
範例三
改用 ' 單引號
<span onclick='<%# Eval("Id","MyMethod('{0}')") %>' runat=”server”></span>正常 因為runat=server 輸芔HTML時屬性外圍是用 " 雙引號,就算打單引號也一樣。
範例四
移除runat=server
<span onclick='<%# Eval("Id","MyMethod('{0}')") %>'></span>
失敗 – JavaScript 語法錯誤。
範例五
將MyMethod的單引號改成雙引號
<span onclick='<%# Eval("Id","MyMethod("{0}")") %>'></span>
失敗 -剖析器錯誤
從上面的幾個範例可以發現HtmlControl在是否runat=server,使用單引雙引號有不同的結果,有時因為需要而增加或移除runat=server,我的網頁就掛了,而且一堆單引雙引號常搞的自己灰掉,所以想找出通用做法,可以在二個狀態間共用,後來發現還滿簡單的,使用Escape就可以了。
通用解決方法
<span onclick='<%# Eval("Id","MyMethod(\"{0}\")") %>' runat='server'></span>
<span onclick='<%# Eval("Id","MyMethod(\"{0}\")") %>'></span>
不管是不是runat=server都是 外圍單引號 裡面的雙引號加上斜線如
onclick='<%# Eval("Id","MyMethod(\"{0}\")") %>'
來看輸出成HTML的結果吧
runat=server
<span onclick="MyMethod("456a403d-7a8c-45ea-b7f3-e4a61ad9b117")"></span>
非runat=server
<span onclick='MyMethod("456a403d-7a8c-45ea-b7f3-e4a61ad9b117")'></span>
在runat=sever因為外圍一定是雙引號,可是ASP.NET輸出HTML時把內部的雙引號改成",這是html表示雙引號編碼,執行javascript會解碼,所以執行javascript不會產生問題。
雖然一堆 \" 看起來也有點灰,不過總比不一致又容易錯好。
後話:
這個技巧自己試了很久,前些日子我還用\u0027,\u0022來解決,但發現還是不好用,最近才發現\"最好用。
測試
Server : Win 2003 + .Net Framework 3.5
IE 6-8 : OK
Chrome 5 : OK
Firefox 3.5 : OK