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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

深入剖析微软ASP.NET Ajax中的数据绑定构架下篇之二

發布時間:2025/3/21 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入剖析微软ASP.NET Ajax中的数据绑定构架下篇之二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
四、例2—數據庫綁定

現在,我們來討論更為復雜的數據庫綁定的例子。根據我們前面的討論,我們找到了使用DataSource的典型場所;在前面的例1中,我們使用了一種內存數據來模擬有狀態的web服務。但是,在實際開發中,一般不這樣使用。在本節中,我們要創建一個非常貼近于實際開發環境應用的例子。

1.創建工程

啟動Visual Studio 2005并選用模板“ASP.NET AJAX CTP-Enabled Web Site”創建一個新的網站并命名為DatabaseBinding,最后選定Visual C#為內置語言。然后,稍微修改頁面Default.aspx,最后的結果如下圖4所示。

圖4:示例2的設計時刻頁面

2.后臺代碼分析

下面是頁面Default.aspx中HTML元素的定義部分。

列表6

<!--------------------------------------------------->

<div id="detailsView"></div>

<!--------------------------------------------------->

<input type="button" id="previousButton" value="Previous"

title="Go to previous row" style="width: 67px; height: 30px;" />

<span id="rowIndexLabel"></span>

<input id="nextButton" type="button" value="Next" title="Go to next row"

style="width: 67px; height: 30px;" />

<input type="button" id="addButton" value="Add" title="Create a new row"

style="width: 67px; height: 30px;" />

<input type="button" id="delButton" value="Delete"

title="Delete the current row" style="width: 67px; height: 30px;" />

<input type="button" id="saveButton" value="Save"

title="Save all pending changes" style="width: 67px; height: 30px;" />

<input type="button" id="refreshButton" value="Refresh"

title="Discard pending changes and get the latest data from the server"

style="width: 73px; height: 30px" />

<!--------------------------------------------------->

<div style="visibility:hidden;display:none" >

<div id="detailsTemplate" class="ListWindow">

Name: <input id="nameField" size="30" /><br />

Address:<br />

<textarea id="addressField" style="width: 428px;

height: 130px" rows="4" cols="4"></textarea><br />

</div>

<div id="emptyTemplate">

Loading Data...

</div>

</div>

根據圖4中的布局和上面的代碼,我們在此首先定義了兩個導航按鈕—previousButton和nextButton—它們都用于顯示于客戶端(而不是服務器端)的控件ItemView相應的數據源的數據記錄間的導航。然后,我們定義了兩個按鈕(addButton,delButton)以實現對數據庫中記錄的修改操作。最后兩個按鈕—saveButton和refreshButton直接相應于MS AJAX客戶端控件DataSource的save和load兩個方法。之后,我們使用了一組HTML DIV元素來描述控件ItemView。在此,建議你把這里的對應關系與例一1中的控件ListView與HTML元素的對應關系加以比較。

3.創建一個連接到數據庫的Web服務

(1)創建一個示例數據庫—DataBind.mdf

右擊工程并選定“添加新項”,然后選擇模板“SQL數據庫”,你可以容易地創建一個空的數據庫—在此,我們命名它為DataBind.mdf。然后,我們把唯一的一個表(Employees)添加到其中。這個表中包含三個字段:Id(int,primary key),Name(nvarchar(50),not empty)和Address (nvarchar(50),not empty)。同時,我們還創建了四個簡單的存儲過程:DeleteRecord,GetAllRecords,InsertRecord,UpdateRecord,它們相應于典型的數據庫CRUD操作。因為我們的重點不在此,所以不再詳細加以討論。

(2)創建一個類—Employee

注意,這個類非常類似于第一個例子中的類Employees—充當數據庫表格的OOP包裝;具體地說,這是通過把它的修飾有屬性DataObjectField的成員變量映射到定義于表格Employees中的字段實現的。

(3)兩個幫助者類—SqlHelper(來自于MS AJAX示例中)和SqlTaskProvider

為了問題的簡化和通用起見,我們創建了兩個幫助者類。一個是SqlHelper(來自于隨同MS AJAX發行的示例程序TaskList);另一個是SqlTaskProvider。由于這些內容有些遠離了本文的主題,所以,在此也不多解釋,有興趣的讀者可詳細研究本文所附源碼。

現在,讓我們來創建一個DataService(派生自Web Service)并使之與數據庫相連接。

2.創建連接到數據庫的DataService

下面,我們先列出這個DataService相關的MyDataService.asmx的關鍵代碼:

列表7

//……(省略)

using System.ComponentModel;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Data;

using System.Web.Script.Services;

using Microsoft.Web.Preview.Services;

using Demos.Employee;//defines class SqlTaskProvider

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[ScriptService]

public class MyDataService : DataService

{

[WebMethod]

[DataObjectMethod(DataObjectMethodType.Delete)]

public void DeleteRecord(Employee emp)

{

if (emp.Name == null)

{

throw new AccessViolationException();

}

new SqlTaskProvider().DeleteRecord(emp);

}

[WebMethod]

[DataObjectMethod(DataObjectMethodType.Select)]

public List<Employee> GetAllRecords()

{

return new SqlTaskProvider().GetAllRecords();

}

[WebMethod]

[DataObjectMethod(DataObjectMethodType.Insert)]

public void InsertRecord(Employee emp)

{

if (emp.Name == null)

{

throw new AccessViolationException();

}

new SqlTaskProvider().InsertRecord(emp);

}

[WebMethod]

[DataObjectMethod(DataObjectMethodType.Update)]

public void UpdateRecord(Employee emp)

{

if (emp.Name == null)

{

throw new AccessViolationException();

}

new SqlTaskProvider().UpdateRecord(emp);

}

}

略微加以分析,你應該得如圖5所示的調用關系圖:

圖5:例2中各主要模塊間的調用關系

接下來,讓我們分析數據綁定是如何在客戶端實現的。注意,這里我們仍然使用xml-script聲明性方式。

4.客戶端聲明性編程

在此,非常類似于前一個例子,我們首先建立HTML元素與控件ItemView的模板間的映射關系:

列表8

<script type="text/xml-script">

<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">

<components>

<dataSource id="EmployeeDataSource" serviceURL="MyDataService.asmx" >

</dataSource>

<itemView id="detailsView">

<bindings>

<binding dataContext="EmployeeDataSource"

dataPath="data" property="data" />

<binding dataContext="EmployeeDataSource"

dataPath="isReady"?? property="element" propertyKey="enabled"/>

</bindings>

<itemTemplate>

<template layoutElement="detailsTemplate">

<textBox id="nameField">

<bindings>

<binding dataPath="Name"

property="text" direction="InOut"/>

</bindings>

</textBox>

<textBox id="addressField">

<bindings>

<binding dataPath="Address"

property="text" direction="InOut"/>

</bindings>

</textBox>

</template>

</itemTemplate>

<emptyTemplate>

<template layoutElement="emptyTemplate" />

</emptyTemplate>

</itemView>

在此,有幾處需要注意。首先,控件ItemView典型地用于顯示一條記錄—基于MS AJAX客戶端數據綁定方案,而控件ListView卻用于顯示滿足一定范圍的一批記錄。其次,控件ItemView使用了兩個綁定:第一個綁定將把從DataSource返回的數據綁定到控件ItemView的data屬性上,以確保ItemView控件能夠從數據源取得它所要求的完整的數據;第二個綁定把ItemView控件的enabled屬性綁定到DataSource的IsReady屬性上。這意味著,當數據源還沒有準備好時(例如數據源正在從服務器端讀寫數據),控件ItemView將被禁用。第三,我們使用了雙向綁定技術,這意味著不僅源控件屬性(dataContext屬性指向的那個)的改變將更新目標控件相應的屬性,而且反過來也如此。最后,我們還要注意,DataSource的改變將使數據變‘臟’—DataSource控件的isDirty屬性將被置為true。

接下來,讓我們看一下頁面中使用的兩個導航按鈕的定義。

列表9

<button id="previousButton">

<click>

<invokeMethodAction target="detailsView" method="movePrevious" />

</click>

<bindings>

<binding dataContext="detailsView" dataPath="canMovePrevious"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>

</button>

<label id="rowIndexLabel">

<bindings>

<binding dataContext="detailsView" dataPath="dataIndex"

property="text" transform="Add" />

</bindings>

</label>

<button id="nextButton">

<click>

<invokeMethodAction target="detailsView" method="moveNext" />

</click>

<bindings>

<binding dataContext="detailsView" dataPath="canMoveNext"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>

</button>

在此,控件ItemView提供的一些方法和屬性用于實現加載到其中的相鄰記錄之間的導航。如果用戶正在瀏覽第一條記錄,那么屬性canMovePrevious被設置為false;否則為true。此外,我們還為按鈕previousButton的click事件指定了一個相應的行為。至于按鈕nextButton,情況與之一致。另外,我們通過dataIndex屬性來讀取當前記錄的索引值并把它綁定到label控件。

現在,讓我們來討論最有趣也是最重要的與數據庫相關的CRUD操作部分。

列表10

<button id="addButton">

<click>

<invokeMethodAction target="detailsView" method="addItem" />

</click>

<bindings>

<binding dataContext="EmployeeDataSource" dataPath="isReady"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>

</button>

<button id="delButton">

<click>

<invokeMethodAction target="detailsView" method="deleteCurrentItem" />

</click>

<bindings>

<binding dataContext="EmployeeDataSource" dataPath="isReady"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>?

</button>

<button id="saveButton">

<click>

<invokeMethodAction target="EmployeeDataSource" method="save" />

</click>

<bindings>

<binding dataContext="EmployeeDataSource" dataPath="isDirtyAndReady"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>

</button>

<button id="refreshButton">

<click>

<invokeMethodAction target="EmployeeDataSource" method="load" />

</click>

<bindings>

<binding dataContext="EmployeeDataSource" dataPath="isReady"?

property="element" propertyKey="disabled" transform="Invert" />

</bindings>?

</button>

在此,當我們需要向數據集中添加新記錄時,調用控件ItemView的addItem方法—此時數據源必須準備好。對于按鈕delButton,情況也非常類似。當數據源準備好后,調用控件ItemView的方法deleteCurrentItem;否則按鈕delButton被置為disabled。

對于按鈕saveButton,情況則比較復雜。只有當數據源變‘臟’并且數據源已經準備好后,我們才能夠保存數據。讀者應該還記得在前面定義的那幾個TextBox控件(它們位于ItemView控件的ItemTemplate模板內,并且都是進行雙向的數據綁定)。所以,當用戶更改任何一個TextBox控件中的內容時,ItemView控件的數據集將被自動更新,而且其數據源中的數據集也是如此。最后,數據源變‘臟’;同時,數據源也準備好,于是屬性isDirtyAndReady被置為true—此時,按鈕saveButton才會激活可用;否則不可用。

當你點擊按鈕refreshButton時,將再次發生一次SELECT查詢,這又進一步觸發所有綁定并把最新數據加載到當前頁面中的控件內。請注意,這里的刷新操作是以AJAX方式(異步)實現的,因此,僅有控件ItemView被更新而不會產生整個頁面的閃爍問題。

4.運行程序

如果沒有什么問題的話,按下F5鍵,你將會看到如下圖6所示的運行時刻快照。

圖6:例2的運行時刻快照

乍看這個屏幕,你會感覺它非常類似一個傳統的桌面數據庫應用程序的界面,但實際上其中顯示的數據卻是來自于一個遠方的服務數據庫!在此,我們再次領略了MS AJAX框架的威力。

五、總結

在本系列的這兩篇文章中,我們深入剖析了微軟ASP.NET Ajax中的數據綁定構架。因為本人也是這個框架的新手,而且這個框架也一直處于發展當中(特別是Futures CTP部分),所以在其中涉及的許多概念和例子里面很可能存在一定的錯誤,真誠希望讀者朋友能夠幫助批評指正。

轉載于:https://www.cnblogs.com/xujiaci/archive/2007/09/13/891431.html

總結

以上是生活随笔為你收集整理的深入剖析微软ASP.NET Ajax中的数据绑定构架下篇之二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 综合激情在线 | 精品欧美一区二区三区免费观看 | 黄色三级在线视频 | 三级少妇 | 欧美无专区 | 国产人妻人伦精品1国产 | 国产精品99久久久久久www | 欧美一级久久久 | 欧美日韩一区二区视频在线观看 | 日本大片黄 | 欧美精品极品 | 激情爱爱网站 | 免费av的网站 | 欧美爽爽爽 | 一本之道高清无码视频 | 欧美黑人三级 | jizzjizz日本人| 成年人在线视频免费观看 | 亚洲日本中文字幕在线 | 婷婷干| 亚洲青青草原 | 国产精品自拍av | 一区二区三区精品免费视频 | 色在线免费观看 | 日韩高清网站 | 成人免费直播 | 国产午夜一级片 | 青青啪啪 | 97超碰人人模人人人爽人人爱 | 日韩av麻豆| 精品成人免费视频 | 手机在线一区二区三区 | 日韩av不卡电影 | 中文字幕一区二区三区精彩视频 | 一级不卡毛片 | 国产黄色录像 | 亚洲激情av| 操模特| 香蕉视频911| 国产91色 | 国产精品成人一区二区网站软件 | av黄色av| 黄av资源| 亚洲精品wwww | 久久精品国产亚洲av麻豆图片 | 国产成人77亚洲精品www | 欧美成人三级在线视频 | 中文字幕第三页 | 福利一区在线观看 | 久久538 | 动漫艳母在线观看 | 精品欧美一区二区久久久久 | 少妇人妻一级a毛片 | 久久93| 在线播放国产精品 | 中文久久乱码一区二区 | 男人和女人日批视频 | 国产一区在线看 | 香蕉网站视频 | 免费观看a毛片 | 亚洲伦理一区二区三区 | 老司机av影院 | 日日操视频 | 熟女少妇一区二区三区 | 深夜视频一区二区 | 96在线观看 | 国产精品成人在线观看 | 97久草| 长篇h版少妇沉沦交换 | 四虎视频国产精品免费入口 | 亚洲精品一区二区潘金莲 | 国产在线视视频有精品 | 91免费视频网| 久热网站 | 国产一区精品在线 | 男人添女人下部高潮视频 | 另类小说亚洲色图 | aaa影院| 亚洲精品视频播放 | 奇米影视首页 | 精品视频免费播放 | 亚洲精品第三页 | 蜜桃久久久 | 日韩成人免费视频 | 久久极品 | 日韩av成人 | 一级做a爱片久久毛片 | 亚洲va国产va天堂va久久 | 国产精品久久久久久婷婷天堂 | 2019中文字幕在线免费观看 | 四虎精品欧美一区二区免费 | 黄色aa级片 | 伊人网大 | 中文字幕日韩av | www视频在线观看免费 | 美日韩免费视频 | 日本女优一区 | 日韩电影一区二区三区 | 免费观看已满十八岁 |