熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

asp.net bind()和eval()的區別

2013-11-13 10:21:01  來源: .NET編程 
    eval()方法
   
    在運行時使用反射執行後期綁定計算因此與標准的ASPNET數據綁定方法bind相比會導致性能明顯下降它一般用在綁定時需要格式化字符串的情況下多數情況盡量少用此方法
   
    Eval 方法是靜態(只讀)方法該方法采用數據字段的值作為參數並將其作為字符串返回Bind 方法支持讀/寫功能可以檢索數據綁定控件的值並將任何更改提交回數據庫
   
    使用 Eval 方法
   
    Eval 方法可計算數據綁定控件(如 GridViewDetailsView 和 FormView 控件)的模板中的後期綁定數據表達式在運行時Eval 方法調用 DataBinder 對象的 Eval 方法同時引用命名容器的當前數據項命名容器通常是包含完整記錄的數據綁定控件的最小組成部分如 GridView 控件中的一行因此只能對數據綁定控件的模板內的綁定使用 Eval 方法
   
    Eval 方法以數據字段的名稱作為參數從數據源的當前記錄返回一個包含該字段值的字符串可以提供第二個參數來指定返回字符串的格式該參數為可選參數字符串格式參數使用為 String 類的 Format 方法定義的語法
   
    關於eval()效率
   
    庸置疑的是強類型轉換Container的效率是最高的Eval最終是調用DataBinderEval方法DataBinderEval是采用反射來獲取數據的這顯然不如強類型數據轉換
   
    我們可以比較一下各種方法
   
    ((Type)   ContainerDataItem)Property
   
    這種方法效率是最高的因為不存在任何反射
   
    其次是
   
    ((Type)   GetDataItem())Property
   
    這種方法效率差的原因在於多了一個Stack的Peek操作當然實際上這點兒差別可以忽略
   
    最後是    Eval或者DataBinderEval這兩種方法都使用反射來查找屬性或者索引器成員效率大打折扣
   
    另外一個值得注意的問題是所有實現了INamingContainer接口的Control都應該實現IDataItemContainer接口因為在ControlDataBind的時候如果發現控件實現了INamingContainer接口就會試圖去尋找它的DataItem如果這個控件沒有實現IDataItemContainer則DataBinderGetDataItem方法會使用反射看看控件有沒有一個叫做DataItem的屬性成員顯然這不是我們希望看到的
   
    其實ASPNET還有一個標記接口INonBindingContainer實現了INamingContainer接口的控件可以選擇同時實現這個來命令ASPNET不去尋找DataItem可是很可惜不知道微軟出於什麼目的這個接口是internal的……
   
    其實效率方面不必太重視了Eval表達式很好看的即使有那麼極端的重視效率GeDataItem也是不錯的選擇毋庸置疑的是強類型轉換Container的效率是最高的Eval最終是調用DataBinderEval方法DataBinderEval是采用反射來獲取數據的這顯然不如強類型數據轉換
   
    eval()綁定方法
   
    x中的數據綁定語法
   
    代碼如下
   
    <asp:Literal id=litEval runat=server Text=<%#DataBinderEval(ContainerDataItem userName)%> />
   
    x簡化Eval數據綁定語法
   
    代碼如下
   
    <asp:Literal id= runat=server Text=<%Eval(userName)%> />
   
    第二種方法的方法重載
   
    代碼如下
   
    <a <%# Eval(userIdDefaultaspx?id={})%>><%# Eval(userName) %></a>
   
    eval同時綁定兩個值
   
    代碼如下
   
    <a <%# stringFormat(Defaultaspx?id={}&role={} Eval(userIdEval(userRole))%>><%# Eval(userName) %></a>


    
    Bind()方法
   
    Bind 方法與 Eval 方法有一些相似之處但也存在很大的差異雖然可以像使用 Eval 方法一樣使用 Bind 方法來檢索數據綁定字段的值但當數據可以被修改時還是要使用 Bind 方法
   
    在 ASPNET 中數據綁定控件(如 GridViewDetailsView 和 FormView 控件)可自動使用數據源控件的更新刪除和插入操作例如如果已為數據源控件定義了 SQL SelectInsertDelete 和 Update 語句則通過使用 GridViewDetailsView 或 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 語法綁定的每個控件屬性值都會被提取出來並傳遞給數據源控件以執行更新操作

    
    使用 DataBinderEval
   
    ASPNET 提供了一個名為 DataBinderEval 的靜態方法該方法計算後期綁定的數據綁定表達式並將結果格式化為字符串(可選)利用此方法可以避免許多在將值強制為所需數據類型時必須執行的顯式強制轉換操作
   
    例如在下面的代碼片段中一個整數顯示為貨幣字符串使用標准的 ASPNET 數據綁定語法必須首先強制轉換數據行的類型以便檢索數據字段 IntegerValue然後這將作為參數傳遞到 StringFormat 方法
   
    代碼如下
   
    <%# StringFormat({:c} ((DataRowView)ContainerDataItem)[IntegerValue]) %>
   
    將此語法與 DataBinderEval 的語法進行比較後者只有三個參數數據項的命名容器數據字段名稱和格式字符串在模板化列表中(如 DataList 類DataGrid 類或 Repeater 類)命名容器始終是 ContainerDataItem
   
    代碼如下
   
    <%# DataBindereval_r(ContainerDataItem IntegerValue {:c}) %>
   
    格式字符串參數是可選的如果它被忽略DataBinderEval 將返回類型對象的值如下面的示例所示
   
    代碼如下
   
    <%# (bool)DataBindereval_r(ContainerDataItem BoolValue) %>
   
    當對模板化列表中的控件進行數據綁定時DataBinderEval 特別有用因為數據行和數據字段通常都必須強制轉換
   
    在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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.