eval()方法
在運行時使用反射執行後期綁定計算
因此與標准的ASP
NET數據綁定方法bind相比
會導致性能明顯下降
它一般用在綁定時需要格式化字符串的情況下
多數情況盡量少用此方法
Eval 方法是靜態(只讀)方法
該方法采用數據字段的值作為參數並將其作為字符串返回
Bind 方法支持讀/寫功能
可以檢索數據綁定控件的值並將任何更改提交回數據庫
使用 Eval 方法
Eval 方法可計算數據綁定控件(如 GridView
DetailsView 和 FormView 控件)的模板中的後期綁定數據表達式
在運行時
Eval 方法調用 DataBinder 對象的 Eval 方法
同時引用命名容器的當前數據項
命名容器通常是包含完整記錄的數據綁定控件的最小組成部分
如 GridView 控件中的一行
因此
只能對數據綁定控件的模板內的綁定使用 Eval 方法
Eval 方法以數據字段的名稱作為參數
從數據源的當前記錄返回一個包含該字段值的字符串
可以提供第二個參數來指定返回字符串的格式
該參數為可選參數
字符串格式參數使用為 String 類的 Format 方法定義的語法
關於eval()效率
庸置疑的是強類型轉換Container的效率是最高的
Eval最終是調用DataBinder
Eval方法
DataBinder
Eval是采用反射來獲取數據的
這顯然不如強類型數據轉換
我們可以比較一下各種方法
((Type) Container
DataItem)
Property
這種方法效率是最高的
因為不存在任何反射
其次是
((Type) GetDataItem())
Property
這種方法效率差的原因在於多了一個Stack的Peek操作
當然
實際上這點兒差別可以忽略
最後是
Eval或者DataBinder
Eval
這兩種方法都使用反射來查找屬性或者索引器成員
效率大打折扣
另外一個值得注意的問題是
所有實現了INamingContainer接口的Control
都應該實現IDataItemContainer接口
因為在Control
DataBind的時候
如果發現控件實現了INamingContainer接口
就會試圖去尋找它的DataItem
如果這個控件沒有實現IDataItemContainer
則DataBinder
GetDataItem方法會使用反射看看控件有沒有一個叫做DataItem的屬性成員
顯然這不是我們希望看到的
其實ASP
NET還有一個標記接口
INonBindingContainer
實現了INamingContainer接口的控件可以選擇同時實現這個來命令ASP
NET不去尋找DataItem
可是很可惜
不知道微軟出於什麼目的
這個接口是internal的……
其實效率方面不必太重視了
Eval表達式很好看的
即使有那麼極端的重視效率
GeDataItem也是不錯的選擇
毋庸置疑的是強類型轉換Container的效率是最高的
Eval最終是調用DataBinder
Eval方法
DataBinder
Eval是采用反射來獲取數據的
這顯然不如強類型數據轉換
eval()綁定方法
x中的數據綁定語法
代碼如下
<asp:Literal id=
litEval
runat=
server
Text=
<%#DataBinder
Eval(Container
DataItem
userName
)%>
/>
x簡化Eval數據綁定語法
代碼如下
<asp:Literal id=
runat=
server
Text=
<%Eval(
userName
)%>
/>
第二種方法的方法重載
代碼如下
<a <%# Eval(
userId
Default
aspx?id={
}
)%>
><%# Eval(
userName
) %></a>
eval同時綁定兩個值
代碼如下
<a <%# string
Format(
Default
aspx?id={
}&role={
}
Eval(
userId
)
Eval(
userRole
))%>
><%# Eval(
userName
) %></a>
Bind()方法
Bind 方法與 Eval 方法有一些相似之處
但也存在很大的差異
雖然可以像使用 Eval 方法一樣使用 Bind 方法來檢索數據綁定字段的值
但當數據可以被修改時
還是要使用 Bind 方法
在 ASP
NET 中
數據綁定控件(如 GridView
DetailsView 和 FormView 控件)可自動使用數據源控件的更新
刪除和插入操作
例如
如果已為數據源控件定義了 SQL Select
Insert
Delete 和 Update 語句
則通過使用 GridView
DetailsView 或 FormView 控件模板中的 Bind 方法
就可以使控件從模板中的子控件中提取值
並將這些值傳遞給數據源控件
然後數據源控件將執行適當的數據庫命令
出於這個原因
在數據綁定控件的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函數
Bind 方法通常與輸入控件一起使用
例如由編輯模式中的 GridView 行所呈現的 TextBox 控件
當數據綁定控件將這些輸入控件作為自身呈現的一部分創建時
該方法便可提取輸入值
Bind 方法采用數據字段的名稱作為參數
從而與綁定屬性關聯
如下面的示例所示
Bind 方法通常與輸入控件一起使用
例如由編輯模式中的 GridView 行所呈現的 TextBox 控件
當數據綁定控件將這些輸入控件作為自身呈現的一部分創建時
該方法便可提取輸入值
Bind 方法采用數據字段的名稱作為參數
從而與綁定屬性關聯
如下面的示例所示
代碼如下
<EditItemTemplate>
<table>
<tr>
<td align=right>
<b>Employee ID:</b>
</td>
<td>
<%# eval_r(
EmployeeID
) %>
</td>
</tr>
<tr>
<td align=right>
<b>First Name:</b>
</td>
<td>
<asp:TextBox ID=
EditFirstNameTextBox
RunAt=
Server
Text=
<%# Bind(
FirstName
) %>
/>
</td>
</tr>
<tr>
<td align=right>
<b>Last Name:</b>
</td>
<td>
<asp:TextBox ID=
EditLastNameTextBox
RunAt=
Server
Text=
<%# Bind(
LastName
) %>
/>
</td>
</tr>
<tr>
<td colspan=
>
<asp:LinkButton ID=
UpdateButton
RunAt=
server
Text=
Update
CommandName=
Update
/>
<asp:LinkButton ID=
CancelUpdateButton
RunAt=
server
Text=
Cancel
CommandName=
Cancel
/>
</td>
</tr>
</table>
</EditItemTemplate>
單擊行的 Update 按鈕時
使用 Bind 語法綁定的每個控件屬性值都會被提取出來
並傳遞給數據源控件以執行更新操作
使用 DataBinder
Eval
ASP
NET 提供了一個名為 DataBinder
Eval 的靜態方法
該方法計算後期綁定的數據綁定表達式
並將結果格式化為字符串(可選)
利用此方法
可以避免許多在將值強制為所需數據類型時必須執行的顯式強制轉換操作
例如
在下面的代碼片段中
一個整數顯示為貨幣字符串
使用標准的 ASP
NET 數據綁定語法
必須首先強制轉換數據行的類型以便檢索數據字段 IntegerValue
然後
這將作為參數傳遞到 String
Format 方法
代碼如下
<%# String
Format(
{
:c}
((DataRowView)Container
DataItem)[
IntegerValue
]) %>
將此語法與 DataBinder
Eval 的語法進行比較
後者只有三個參數
數據項的命名容器
數據字段名稱和格式字符串
在模板化列表中(如 DataList 類
DataGrid 類或 Repeater 類)
命名容器始終是 Container
DataItem
代碼如下
<%# DataBinder
eval_r(Container
DataItem
IntegerValue
{
:c}
) %>
格式字符串參數是可選的
如果它被忽略
DataBinder
Eval 將返回類型對象的值
如下面的示例所示
代碼如下
<%# (bool)DataBinder
eval_r(Container
DataItem
BoolValue
) %>
當對模板化列表中的控件進行數據綁定時
DataBinder
Eval 特別有用
因為數據行和數據字段通常都必須強制轉換
在TemplateField模板中為了能夠有限制的或者取出數據庫中某列的值時
可以用Bind和Eval方法來實現
以下是Bind方法的格式
Eval的格式也是和Bind一樣的
Bind(
列的名稱
顯示的格式文
)
比如我們要取個日期型的數據
在數據庫中列名是updated
數值是
/
/
但是想
年
月
日這樣顯示
我們可以這樣來寫Bind(
updated
{
:yyyy年MM月dd日}
)
Eval也是如此
兩者都能讀取數據中的值
並顯示
當我們使用編輯更新操作時
Bind能夠自動的將修改的值更新到數據庫中
並顯示出修改後的值
但是用了Eval卻只能得到錯誤畫面
新的數據沒有更新到數據庫中
從這點看來
Bind方法和Eval方法的區別就是
Bind方法在讀取和更新數據這
方面都是可以
但是Eval方法只能讀取顯示數據
所以
我們在選擇Bind方法和Eval方法的時候
必須要有爭對性
當數據肯定需要更新操作的時候我們應該使用Bind
只是顯示數據
不會有任何操作的就可以使用Eval方法
bind()和eval()區別
Eval是只讀數據
Bind是可更新的
當對次表達式操作時候
必須用Eval 如<%# Eval(
字段名
)
ToString()
Trim() %>
若GridView中綁定列裡面 設置 內容格式 DataFormateString ={
:d}
則 必須把 屬性 HtmlCode 設置為false
否則無法起作用
Eval 單向綁定
數據是只讀的
Bind 雙向綁定
數據可以更改
並返回服務器端
服務器可以處理更改後的數據
如存入數據庫
From:http://tw.wingwit.com/Article/program/net/201311/13337.html