日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

深入ASP.NET数据绑定(中)——数据双向绑定机理

發(fā)布時間:2025/3/20 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入ASP.NET数据绑定(中)——数据双向绑定机理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??? 轉(zhuǎn)載自 阿不 http://hjf1223.cnblogs.com/

在上一篇《深入ASP.NET數(shù)據(jù)綁定(上)》中,我們分析了在.NET中的數(shù)據(jù)綁定語法的一些內(nèi)部機理。簡單說來就是ASP.NET在運行時為我們完成了頁面的動態(tài)編譯,并解析頁面的各種服務(wù)器端代碼,包括數(shù)據(jù)綁定語法。而數(shù)據(jù)綁定的語法雖是一些<%# %>代碼塊,在生成的代碼中,仍然使用了服務(wù)器端控件以及在DataBinding事件調(diào)用DataBinder.Eval方法來完成數(shù)據(jù)的綁定工作。所有的數(shù)據(jù)綁定模板控件都使用了這樣的機制來進行數(shù)據(jù)的單向綁定,在.NET 2.0中新增了雙向的數(shù)據(jù)綁定方式,主要用在GridView,DetailsView,FormView等數(shù)據(jù)容器控件中,結(jié)合DataSourceControl就可以非常輕松的完成數(shù)據(jù)的更新和提交工作,而不需要我們手工去遍歷輸入控件的值。那在這樣的雙向數(shù)據(jù)綁定中,ASP.NET又是做了哪些工作,來為我們透明輸入控件與字段的取值與對應(yīng)關(guān)系,讓我們可以在DataSouceControl中方便得到數(shù)據(jù)項修改前的值和修改后的值?下面就讓我們一起來從一段頁面代碼開始吧:

1: <asp:DetailsDataSouce ID="DetailsDataSouce1" runat="server"> 2: </asp:DetailsDataSouce> 3: <asp:DetailsView ID="detailsView" runat="server" DefaultMode="Edit" DataSourceID="DetailsDataSouce1"> 4: <Fields> 5: <asp:TemplateField> 6: <HeaderTemplate> 7: 電流:</HeaderTemplate> 8: <EditItemTemplate> 9: <asp:TextBox ID="textBox1" runat="server" Text='<%# Bind("[電流{a}]") %>'></asp:TextBox> 10: </EditItemTemplate> 11: </asp:TemplateField> 12: </Fields> 13: </asp:DetailsView>

在一個頁面中,定義了如上的一個DetailsView控件,為這個控件指定了ID為DetailsDataSource1的DataSouceControl控件,這個控件是我們自己定義的一個DataSourceControl,它返回的數(shù)據(jù)字段包括:"ID","電流{a}","電壓(v)","備注'","名稱]"。我并沒有設(shè)置DetailsView的AutoGenerateRows屬性的值,默認情況下,它是為我們自動的生成這些字段的對應(yīng)的數(shù)據(jù)顯示和輸入控件。除此之外,我們還另外添加了一個數(shù)據(jù)模板字段,在這個模板中指定了編輯模板。在編輯模板中我使用了<%# Bind("")%>這樣的語法,將textBox1與"[電流{a}]"字段雙向綁定起來。

為什么這里的字段都有一些特殊呢?因為我原先的意圖是除了分析綁定語法以外,還要測試哪些特殊字符無法使用數(shù)據(jù)綁定語法來綁定數(shù)據(jù)的。這個在下篇文章中會具體介紹。

Bind與Eval不一樣,這樣的Bind并不Page或TemplateControl的一個方法,事實上我們應(yīng)該把它當(dāng)成一個關(guān)鍵字來看待,因為在ASP.NET的雙向數(shù)據(jù)綁定當(dāng)中,并沒有這樣的一個函數(shù)存在,它的存在是只是告訴ASP.NET動態(tài)編譯頁面類時,將這個語法編譯成一定的代碼格式,并生成一些函數(shù)代理來達到雙向數(shù)據(jù)交流的目的。

那么這一段代碼,動態(tài)編譯生成的服務(wù)器代碼又是如何的呢?讓我們反編譯動態(tài)程序集,里面會找到用于創(chuàng)建DetailsView的__BuildControldetailsView的私有方法,在這里會調(diào)用到一些其它內(nèi)部方法,我們不要讓這些方法來干擾我們的視線,直接找到創(chuàng)建如上模板字段的方法:

1: [DebuggerNonUserCode] 2: private TemplateField __BuildControl__control5() 3: { 4: TemplateField field = new TemplateField(); 5: field.HeaderTemplate = new CompiledTemplateBuilder(new BuildTemplateMethod(this.__BuildControl__control6)); 6: field.EditItemTemplate = new CompiledBindableTemplateBuilder(new BuildTemplateMethod(this.__BuildControl__control7), new ExtractTemplateValuesMethod(this.__ExtractValues__control7)); 7: return field; 8: }

這里首先把this.__BuildControl__control6作為一個代理函數(shù),用于創(chuàng)建頭部模板的內(nèi)容,也就是如上的“電流:”字段標題。然后才是創(chuàng)建EditItemTemplate,這個模板又被一些的中介模板所代替,我們只需要來關(guān)心this.__BuildControl__control7和__ExtractValues__control7即可。__BuildControl__control7是為了編輯數(shù)據(jù)字段時,將數(shù)據(jù)字段的值顯示在輸入控件中(輸入控件的初始化,即字段值綁定到輸入控件中);而__ExtractValues__control7則是在提交數(shù)據(jù)時,要找出這個模板內(nèi)所有的雙向綁定字段,將這些字段的值以綁定字段名為Key,以輸入控件的值為Value添加了IOrderedDictionary字典中。DetailsView等數(shù)據(jù)綁定控件調(diào)用這些委托代理來收集所有的被雙向綁定的字段的最新的值。下面分別是兩段函數(shù)的代碼片段:

1: [DebuggerNonUserCode] 2: private TextBox __BuildControl__control8() 3: { 4: TextBox box = new TextBox(); 5: box.TemplateControl = this; 6: box.ApplyStyleSheetSkin(this); 7: box.ID = "textBox1"; 8: box.DataBinding += new EventHandler(this.__DataBinding__control8); 9: return box; 10: } 11: public void __DataBinding__control8(object sender, EventArgs e) 12: { 13: TextBox box = (TextBox) sender; 14: IDataItemContainer bindingContainer = (IDataItemContainer) box.BindingContainer; 15: if (this.Page.GetDataItem() != null) 16: { 17: box.Text = Convert.ToString(base.Eval("[電流{a}]"), CultureInfo.CurrentCulture); 18: } 19: } 1: [DebuggerNonUserCode] 2: public IOrderedDictionary __ExtractValues__control7(Control __container) 3: { 4: TextBox box = (TextBox) __container.FindControl("textBox1"); 5: OrderedDictionary dictionary = new OrderedDictionary(); 6: if (box != null) 7: { 8: dictionary["[電流{a}]"] = box.Text; 9: } 10: return dictionary; 11: }

由上面的代碼片段可以了解到,ASP.NET動態(tài)編譯器是將Bind語法拆分為兩部分:綁定輸出和讀取輸入控件值。綁定輸出部分與前篇介紹的機制是完全一樣的,并且也是調(diào)用DataBinder.Eval方法來綁定數(shù)據(jù);而讀取輸入控件值則是會根據(jù)頁面上控件的類型,以及綁定的控件屬性名稱,生成一段強類型的控件屬性讀取代碼,并將控件的值保存到dictionay中返回出去。而它全然不知,容器控件是如何將這些值合并起來傳給對應(yīng)的DataSouceControl控件的。

關(guān)于數(shù)據(jù)容器控件而何與DataSouceControl協(xié)同工作,并不是我們這里要分析的重點。但是我們可以簡單的描述一下工作流程,以DetailsView的數(shù)據(jù)更新為例:大家通過反編譯DetailsView的源碼,會找到名稱為HandleUpdate的私有方法,在這個方法里面會去處理數(shù)據(jù)項更新前的值(至于在Web環(huán)境中如何保存更新前的值,就需要靠ViewState的強大功能了),和更新后的值(通過ExtractRowValues函數(shù)調(diào)用類似上面生成的__ExtractValues__control7代理函數(shù)來收集所有雙向綁定字段的值存到NewValues里面),并將他們分別保存在兩個不同的IOrderedDictionary對象(OldValues,NewValues)中。然后將調(diào)用對應(yīng)的DataSouceView的Update方法,傳入原字段值和新字段值和一些必須的參數(shù),即可由我們通過重寫DataSourceView的方法來得到所有需要更新字段的原始值和新值,并可以對比比較哪些字段值是否發(fā)生了變化。NBearDataSource控件就是利用了這樣的機制來直接重DataSourceControl和DataSourceView來達到數(shù)據(jù)的全自動修改和添加方案的。

這里還有一點不得不說,在GridView,DetailsView,并不一定需要使用<%# Bind("")%>語法來實現(xiàn)數(shù)據(jù)的雙向綁定,他們的字段雙向綁定可以通過BoundField及它的子控件代替模板控件的綁定語法,一樣可以達到雙向綁定的目的,簡單但沒有模板來得靈活。而在存取不同版本的字段值也是類似的機制。

由于這部分涉及到的都是動態(tài)和內(nèi)部代碼,如果沒有親自去閱讀這些代碼,估計還是很難理解。最后我們再來簡單總結(jié)一下:ASP.NET在模板中雙向綁定字段,是通過<%# Bind() %>這樣的語法,但是Bind我們更應(yīng)該把它理解為是一個關(guān)鍵字,而不是一個函數(shù)。因為在ASP.NET的控件中,并沒有存在這個函數(shù)。ASP.NET運行時在編譯頁面代碼時,會把Bind關(guān)鍵字的代碼當(dāng)成兩部分來編譯:一部分是單向綁定代碼;另一部分而是讀取對應(yīng)輸入控件的綁定屬性,以綁定字段名為Key,添加到IOrderedDictionary中收集返回給數(shù)據(jù)容器控件(GridView,DetailsView,FormView)等,讓它們處理。

總體來說,ASP.NET 2.0的雙向綁定機制給我們在提交數(shù)據(jù)時帶來了極大的方便,盡管有些人很排斥DataSourceControl的模式,但是我們不可否認合理應(yīng)用會大大提高我們的開發(fā)效率。希望通過這兩篇的介紹,我們能對ASP.NET數(shù)據(jù)綁定機制有更多的認識。在下一篇的文章中,我們將會介紹一些關(guān)于數(shù)據(jù)綁定方式,性能,以及對字段名的局限性等相關(guān)主題。

附上示例工程,本文分析面頁是Default3.aspx和App_Web_ryn6wtvv.dll程序集。

系列導(dǎo)航:

深入ASP.NET數(shù)據(jù)綁定(上)

深入ASP.NET數(shù)據(jù)綁定(下)——多樣的綁定方式

轉(zhuǎn)載于:https://www.cnblogs.com/wing626/archive/2008/08/28/1278325.html

總結(jié)

以上是生活随笔為你收集整理的深入ASP.NET数据绑定(中)——数据双向绑定机理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。