黃偉榮的學習筆記

軟體的世界變化萬千,小小的我只能在這洪流奮發向上以求立足。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

記得當初寫ASP.NET時為了資料繫結大傷腦筋,如

範例一

<span onclick="<%# Eval("Id","MyMethod('{0}')") %>"></span>

正常

範例二

加上runat=server

<span onclick="<%# Eval("Id","MyMethod('{0}')") %>" runat=”server></span>

失敗 -剖析器錯誤

 

範例三

改用 ' 單引號

<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(&quot;456a403d-7a8c-45ea-b7f3-e4a61ad9b117&quot;)"></span>

非runat=server

<span onclick='MyMethod("456a403d-7a8c-45ea-b7f3-e4a61ad9b117")'></span>

在runat=sever因為外圍一定是雙引號,可是ASP.NET輸出HTML時把內部的雙引號改成&quot;,這是html表示雙引號編碼,執行javascript會解碼,所以執行javascript不會產生問題。

雖然一堆 \" 看起來也有點灰,不過總比不一致又容易錯好。

 

後話:

這個技巧自己試了很久,前些日子我還用\u0027,\u0022來解決,但發現還是不好用,最近才發現\"最好用。

測試

Server : Win 2003 + .Net Framework 3.5

IE 6-8  : OK

Chrome 5 : OK

Firefox 3.5 : OK