今天才發現這點。我在ASP.NET 2.0的GridView中想要放一個HyperLinkField觸發Javascript Function,但一在DataNavigateUrlFormatString中加上"j avascript:"字眼,產出的HTML裡,該Link會完全消失,只剩下DataTextField的純文字。
<asp:HyperLinkField DataNavigateUrlFields="PRODID,PRODCHNAME"
DataNavigateUrlFormatString="j avascript:fpSelProd('{0}','{1}');void(0);" DataTextField="PRODID" HeaderText="產品代碼" >
<HeaderStyle Width="80px" />
<ItemStyle Width="80px" HorizontalAlign="Center" />
</asp:HyperLinkField>
稍微推敲了一下,這應是ASP.NET 2.0安全強化的一環。由於HyperLinkField Url中的部分內容來自於資料庫裡的欄位,而資料內容來源有可能來自使用者的輸入,無形中可能淪為駭客發動XSS攻擊的管道(如果你還不知道什麼叫XSS,可以看這篇文章),所以ASP.NET 2.0索性一看到j avascript:就把連結移除,把這管道徹底給封了。
網路上有一些解決方案: 其中有一種是改用TemplateField,自己在後端組出<a href="j avascript:....">...</a>丟出來,但依我的看法,如果沒處理好,它還是有可能提供駭客偷渡惡意Javascript Code的機會,除非對欄位內容來源及安全性有絕對的把握,否則不建議使用。
針對這個需求,我這次的做法是在TD掛上onclick事件,再透過DOM去讀出各欄位裡的產品代碼及產品名稱,雖然囉嗦了點,但比直接將資料欄位值組成Javascript來得安全,也才不辜負了ASP.NET 2.0的一番美意。