原因 在DataGrid的Cell上顯示 HTML 編碼後的字符串
怎麼做呢?如果還有惡意的代碼!我想網頁就會出亂子啦!
事例 例如
我有一個DataGrid
用來顯數據庫中的自定義表的數據
表中含有用戶名信息
如果某人在輸入了這樣的信息
<script>alert(
Hello
);</script>
作為用戶名
當浏覽含有這個DataGrid的頁面時就會彈出一個消息框
我們希望的是
在DataGrid的表格上顯示我們輸入的信息
<script>alert(
Hello
);</script>
而不是希望有什麼惡意的東西發生
方法 我的解決辦法就是用<asp:TemplateColum>替換所有的<asp:BoundColumn>
下面是具體的辦法
替換前 <asp:BoundColumn DataField=
Name
HeaderText=
Name
></asp:BoundColumn>
替換後: <asp:TemplateColumn HeaderText=
Name
>
<ItemTemplate>
<%# GetCellEntry( DataBinder
Eval(Container
DataItem
Name
) ) %>
</ItemTemplate>
</asp:TemplateColumn>
GetCellEntry是進行將字符串轉換為 HTML 編碼的字符串
protected string GetCellEntry( object o )
{
string text = o
ToString();
if ( text != null && text
Trim() != string
Empty )
return Server
HtmlEncode( text );
else
return
;
}
這樣的方法讓人感到很麻煩
因為我不得不為每一個DataGrid重復一遍這樣的工作
於是有了下面的解決方法
很好的解決方法就是利用OnItemDataBound事件來解決這個問題
可以在datagrid上設置OnItemDataBound
<asp:datagrid id=
MyDataGrid
runat=
server
OnItemDataBound=
Item_DataBound
></asp:datagrid>
代碼可以這樣寫
private void DataGrid
_ItemDataBound( object sender
System
Web
UI
WebControls
DataGridItemEventArgs e )
{
for ( int i =
; i < DataGrid
Columns
Count; i++ )
{
if ( DataGrid
Columns[i]
GetType() == typeof(
BoundColumn ) &&
( e
Item
ItemType == ListItemType
Item ||
e
Item
ItemType == ListItemType
AlternatingItem ) )
{
BoundColumn boundColumn = (BoundColumn)
DataGrid
Columns[i];
string text = DataBinder
Eval( e
Item
DataItem
boundColumn
DataField
boundColumn
DataFormatString );
e
Item
Cells[i]
Text = Server
HtmlEncode( text );
}
}
}
結論 datagrid數據表格中的數據將會綁定兩次數據源
第一次是在控件自身綁定數據的時候
第二次在觸發ItemDataBound事件的時候
也許這樣做沒有好的效率
但這也是一種不錯的將字符串轉換為 HTML 編碼的字符串的方法
希望在ASP
NET的未來版本中含有
HTML
Encode
的選項
用來處理將字符串轉換為 HTML 編碼的字符串在數據綁定時
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26341.html