asp.net 中Bind與Eval的用法區別分析

來源:互聯網
上載者:User

綁定運算式
<%# Eval("欄位名") %>
<%# Bind("欄位名") %>

區別 1.eval是唯讀資料,bind是可更新的.
        2.當對次運算式操作時候,必須用Eval 如<%# Eval("欄位名").ToString().Trim() %>
        2.若GridView中繫結資料行裡面 設定 內容格式 DataFormateString ={0:d} ,則 必須把 屬性 HtmlCode 設定為false,否則無法 起作用;
        Eval 單向綁定:資料是唯讀
        Bind 雙向繫結:資料可以更改,並返回伺服器端,伺服器可以處理更改後的資料,如存入資料庫教程.

2、詳細介紹
eval()方法在運行時使用反射執行後期綁定計算,因此與標準的ASP.NET資料繫結方法bind相比,會導致效能明顯下降。它一般用在綁定時需要格式化字串的情況下。多數情況盡量少用此方法


Eval 方法是靜態(唯讀)方法,該方法採用資料欄位的值作為參數並將其作為字串返回。Bind 方法支援讀/寫功能,可以檢索資料繫結控制項的值並將任何更改提交回資料庫。

使用 Eval 方法
Eval 方法可計算資料繫結控制項(如 GridView、DetailsView 和 FormView 控制項)的模板中的後期綁定日期運算式。在運行時,Eval 方法調用 DataBinder 對象的 Eval 方法,同時引用命名容器的當前資料項目。命名容器通常是包含完整記錄的資料繫結控制項的最小組成部分,如 GridView 控制項中的一行。因此,只能對資料繫結控制項的模板內的綁定使用 Eval 方法。

Eval 方法以資料欄位的名稱作為參數,從資料來源的目前記錄返回一個包含該欄位值的字串。可以提供第二個參數來指定返回字串的格式,該參數為選擇性參數。字串格式參數使用為 String 類的 Format 方法定義的文法。

使用 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方法和Eval方法的區別就是:Bind方法在讀取和更新資料這2方面都是可以,但是Eval方法只能讀取顯示資料。所以,我們在選擇Bind方法和Eval方法的時候,必須要有爭對性,當資料肯定需要更新操作的時候我們應該使用Bind,只是顯示資料,不會有任何操作的就可以使用 Eval方法。

       在更新操作中我們可以在GridView1_RowUpdating事件中操作,例子如下:

protected void GridView1_RowUpdating( object sender, GridViewUpdateEventArgs e)   
  
{   
  
     //更新行GridViewRow   
  
     GridViewRow row = this .GridView1.Rows[e.RowIndex];   
  
  
  
     //尋找更新的控制項   
  
     DropDownList present = (DropDownList)row.FindControl( "ddlPresent" );   
  
     TextBox price = (TextBox)row.FindControl( "txtPrice" );   
  
     TextBox updated = (TextBox)row.FindControl( "txtUpdated" );   
  
  
  
     //更新   
  
     e.NewValues[ "present" ] = present.SelectedValue;   
  
     e.NewValues[ "price" ] = price.Text;   
  
     e.NewValues[ "updated" ] = updated.Text;   
  
}  
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

        //更新行GridViewRow

        GridViewRow row = this.GridView1.Rows[e.RowIndex];

        //尋找更新的控制項

        DropDownList present = (DropDownList)row.FindControl("ddlPresent");

        TextBox price = (TextBox)row.FindControl("txtPrice");

        TextBox updated = (TextBox)row.FindControl("txtUpdated");

        //更新

        e.NewValues["present"] = present.SelectedValue;

        e.NewValues["price"] = price.Text;

        e.NewValues["updated"] = updated.Text;

    }    

   如果我們能充分理解Bind方法和Eval方法,其實也就沒必要向上面那樣去寫,都是可以自動完成的。上面的方法除了比較複雜的操作才會用到,這也是一個提示。


使用 DataBinder.Eval
ASP.NET 提供了一個名為 DataBinder.Eval 的靜態方法,該方法計算後期繫結資料綁定運算式,並將結果格式化為字串(可選)。利用此方法,可以避免許多在將值強製為所需資料類型時必須執行的顯式強制轉換操作。

例如,在下面的程式碼片段中,一個整數顯示為貨幣字串。使用標準的 ASP.NET 資料繫結文法,必須首先強制轉換資料行的類型以便檢索資料欄位 IntegerValue。然後,這將作為參數傳遞到 String.Format 方法:

<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>

將此文法與 DataBinder.Eval 的文法進行比較,後者只有三個參數:資料項目的命名容器、資料欄位名稱和格式字串。在模板化列表中(如 DataList 類、DataGrid 類或 Repeater 類),命名容器始終是 Container.DataItem。

<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
 
格式字串參數是可選的。如果它被忽略,DataBinder.Eval 將傳回型別對象的值,如下面的樣本所示:

<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>

當對模板化列表中的控制項進行資料繫結時,DataBinder.Eval 特別有用,因為資料行和資料欄位通常都必須強制轉換。
3.其它
Eval:綁定的是唯讀資料的顯示;Bind:可以綁定唯讀資料也可以綁定更新資料,Bind方法還把欄位和控制項的綁定屬性聯絡起來,使得資料控制項(比如GridView等)的Update、Insert和Delete等方法可以使用這種聯絡來作出相應的處理。
    Eval 和 Bind繫結資料在<%# %> 顯示, 若對要顯示的資料作修改或者操作也在<%# %> 中,例如:
   1, 對顯示的字串作字元顯示:<%# (Eval("Address")).ToString().SubString(0,10)%>,顯示10位元的地址。
   2, 對顯示的資訊作判斷:<%# (Eval("if_delete")).ToString == "yes" ?"已刪除":"未刪除"%>

關於eval詳解

<%# Bind("Subject") %> //綁定欄位
<%# Container.DataItemIndex + 1%> //實現自動編號
<%# DataBinder.Eval(Container.DataItem, "[n]") %>
通常使用的方法(這三個效能最好)
<%# DataBinder.Eval(Container.DataItem, "ColumnName") %>
<%# DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
<%# DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
其他用法
<%# ((DataRowView)Container.DataItem)["ColumnName"] %>
<%# ((DataRowView)Container.DataItem).Row["ColumnName"] %>
<%# ((DataRowView)Container.DataItem)["adtitle"] %>
<%# ((DataRowView)Container.DataItem)[n] %>
<%# ((DbDataRecord)Container.DataItem)[0] %>
<%# (((自訂類型)Container.DataItem)).屬性.ToString() %>//如果屬性為字串類型就不用ToString()了
DataBinder.Eval用法範例
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
格式化字串參數是可選的。如果忽略參數,DataBinder.Eval 返回物件類型的值,

//顯示二位小數
<%# DataBinder.Eval(Container.DataItem, "UnitPrice", "${0:F2}") %>

//{0:G}代表顯示True或False
<ItemTemplate>
<asp教程:Image Width="12" Height="12" Border="0" runat="server"
AlternateText='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "{0:G}") %>'
ImageUrl='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "~/images/{0:G}.gif") %>' />
</ItemTemplate>

//轉換類型
((string)DataBinder.Eval(Container, "DataItem.P_SHIP_TIME_SBM8")).Substring(4,4)
{0:d} 日期只顯示年月日
{0:yyyy-mm-dd} 按格式顯示年月日
{0:c} 貨幣樣式
<%#Container.DataItem("price","{0:¥#,##0.00}")%>
<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>
Specifier Type      Format    Output (Passed Double 1.42)   Output (Passed Int -12400)
c   Currency         {0:c}      $1.42      -$12,400
d   Decimal          {0:d}     System.FormatException   -12400
e   Scientific       {0:e}     1.420000e+000     -1.240000e+004
f   Fixed point      {0:f}   1.42     -12400.00
g   General          {0:g}   1.42      -12400
n   Number with commas for thousands   {0:n}   1.42      -12,400
r   Round trippable     {0:r}   1.42      System.FormatException
x   Hexadecimal     {0:x4}   System.FormatException    cf90

{0:d} 日期只顯示年月日
{0:yyyy-mm-dd} 按格式顯示年月日

樣式取決於 Web.config 中的設定
{0:c}   或 {0:£0,000.00} 貨幣樣式   標準英國貨幣樣式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />
</system.web>
顯示為 £3,000.10

{0:c}   或 string.Format("{0:C}", price); 中國貨幣樣式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-cn" uiCulture="zh-cn" />
</system.web>
顯示為 ¥3,000.10

{0:c}   或 string.Format("{0:C}", price); 美國貨幣樣式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
</system.web>
顯示為 $3,000.10

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.