ASP.NET 2.0 ObjectDataSource控制項

來源:互聯網
上載者:User
asp.net|object|控制項

  ObjectDataSource控制項與SqlDataSource控制項的物件模型是類似的。ObjectDataSource沒有ConnectionString屬性,它暴露了TypeName屬性,用於指定需要執行個體化的執行資料操作的物件類型(類名)。ObjectDataSource控制項與SqlDataSource的命令屬性相似,也支援SelectMethod、UpdateMethod、InsertMethod和DeleteMethod等屬性,用於指明執行這些資料操作的關聯類別型的方法。本文將解釋建立資料訪問層和商務邏輯層組件,並通過ObjectDataSource對象展示ASP.NET 2.0資料群組件的技術。

  綁定到資料訪問層

  資料訪問層組件封裝了那些使用SQL命令查詢和修改資料庫的ADO.NET代碼。在典型情況下,它抽象了建立ADO.NET串連和命令的細節資訊,暴露了可以通過適當參數調用的方法。典型的資料訪問層組件可能暴露了下面一些方法:

public class MyDataLayer {
 public DataView GetRecords();
 public DataView GetRecordsByCategory(String categoryName);
 public DataView GetRecordByID(int recordID);

 public int UpdateRecord(int recordID, String recordData);
 public int DeleteRecord(int recordID);
 public int InsertRecord(int recordID, String recordData);
}
  ObjectDataSource可以使用下面的方式來關聯到這個類型:

<asp:ObjectDataSource TypeName="MyDataLayer" SelectMethod="GetRecords" UpdateMethod="UpdateRecord"
DeleteMethod="DeleteRecord" InsertMethod="InsertRecord" runat="server"/>
  ObjectDataSource要求對象有非常特殊的設計模式。這些約束都是Web應用程式請求所處的無狀態的(stateless)環境引起的。由於在典型情況下,對象的建立和銷毀都是為了服務於一個請求,因此通過對象資料來源綁定的對象也是無狀態的。在預設情況下,ObjectDataSource採用TypeName屬性指定的類型的預設的建構函式(不帶參數),儘管通過處理ObjectCreating事件來建立一個自訂對象執行個體,並把它指定給事件參數的ObjectInstance屬性,從而實現執行個體化也是可行的。與SelectMethod屬性關聯的對象方法可以返回任何對象、Ienumerable列表、集合或數組。在上面的資料訪問層樣本中,DataView對象實現了IEnumerable介面。我們在下一部分將討論到,這些方法也可以返回強化類型的集合或對象。

GetProducts() -> ProductCollection
GetProductsDataSet() -> DataSet
GetProduct (int productId) -> Product
  Update、Insert和Delete一般把單獨的資料項目欄位作為參數,也可以把帶有資料項目欄位公用屬性的集合類對象作為參數。

UpdateProduct (int id, String name, double price, bool inStock)
UpdateProduct (Product p) // p.ID, p.Name, p.Price, p.InStock
DeleteProduct (int id)
  與SqlDataSource的例子類似,傳遞到Update、Insert和Delete方法的資料項目的參數名稱或屬性必須與SelectMethod返回的欄位相同,這樣GridView/DetailsView才能自動地進行更新/刪除/插入操作。與SqlDataSource類似,ObjectDataSource方法的參數也可以與資料參數對象相關聯,使用SelectParameters、FilterParameters、UpdateParameters、DeleteParameters或InsertParameters集合。
下面的例子示範了一個通過資料訪問層組件(AuthorsDB)暴露資料的ObjectDataSource控制項。這個類型的類檔案存放在應用程式的App_Code目錄中,在運行時ASP.NET動態地編譯它。

<asp:ObjectDataSource ID="ObjectDataSource2" Runat="server" TypeName="AuthorsDB"
SelectMethod="GetStates"/>

<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" TypeName="AuthorsDB"
SelectMethod="GetAuthorsByState" UpdateMethod="UpdateAuthor" OldValuesParameterFormatString="{0}">
<SelectParameters>
<asp:ControlParameter Name="state" PropertyName="SelectedValue" ControlID="DropDownList1"/>
</SelectParameters>
</asp:ObjectDataSource>

  綁定到商務邏輯層

  關於資料訪問層,我們還需要重點的注意的是,由於SelectMethod把執行查詢的結果作為資料檢視返回,它仍然把下層資料庫的大綱暴露給了顯示頁面。還有,在資料訪問層沒有商務規則;它只是簡單地執行查詢和返回結果。如果需要把顯示與資料庫大綱隔離開來,並引入商務規則或驗證過程,通常需要把資料訪問層封裝到商務邏輯層中。

  商務邏輯層與DAL類似,它給ObjectDataSource暴露了無狀態的方法,用於綁定Web頁面中的控制項。但是,它一般不會直接返回ADO.NET結果,而是返回強化類型的對象,這些對象表現了應用程式所使用的業務實體。這種顯示層與下層資料存放區大綱的分離,使我們更容易地單獨維護網站中的資料訪問部分,而不用修改使用資料的頁面。只要有恰當的中介層,你就可以全面修改下層資料存放區大綱,而不用更新應用程式中的獨立頁面。

  下面就是一個商務邏輯層的例子。

public class MyBusinessLayer {

 public RecordCollection GetRecords();
 public RecordCollection GetRecordsByCategory(String categoryName);
 public RecordCollection GetRecordByID(int recordID);
 public String GetRecordName(int recordID);
 public Object GetRecordData(int recordID);

 public int UpdateRecord(Record r);
 public int DeleteRecord(Record r);
 public int InsertRecord(Record r);

 public int UpdateRecordData(int ID, String Data);
 public int UpdateRecordName(int ID, String Name);
}

public class Record {
 public int ID { get; set; }
 public String Name { get; set; }
 public Object Data { get; set; }
}
  商務邏輯層和資料訪問層之間的主要區別在於,商務邏輯層返回的是強化類型的Record對象的集合(RecordCollection),而不是資料檢視。它也允許我們把這個Record對象作為參數進行更新、插入和刪除操作。ObjectDataSource的DataObjectTypeName屬性允許你配置ObjectDataSource,給它傳遞類型而不是欄位值。在商務邏輯層的方法實現中,你可以包含用於驗證商務規則的自訂邏輯。例如,你可以確保只有“檢查中”類別的Record才能被更新,或者只有Administrators才能插入新記錄。你還可以包含驗證邏輯以確保在插入或修改資料庫的資料之前,作為參數傳遞進來的資料類型和值是正確的。請注意,商務邏輯層中的驗證規則不是顯示層的輸入驗證(它指導終端使用者在提交更新之前輸入正確的值)的替代品。

  下面的例子示範了一個叫做AuthorsComponent的簡單商務邏輯層。在它內部,BLL通過DAL調用來實際執行資料庫操作。為了簡單,BLL沒有包含任何商務規則或驗證,儘管它可能是一個現實的應用程式。我們還要注意,這個例子沒有通過編寫自訂集合類來返回強化類型的記錄,而是利用了.NET架構組件2.0中的稱為“範型(Generics)”的新語言特性來建立Author對象集合。使用強化類型集合讓ObjectDataSource在設計時(在Visual Studio和其它工具中)能夠推匯出業務對象的大綱。

<asp:DropDownList ID="DropDownList1" Runat="server" DataSourceID="ObjectDataSource2" AutoPostBack="True" />
<asp:ObjectDataSource ID="ObjectDataSource2" Runat="server" TypeName="AuthorsComponent" SelectMethod="GetStates"/>
<asp:GridView ID="GridView1" Runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" AllowPaging="True" AllowSorting="True">
……
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" TypeName="AuthorsComponent" SelectMethod="GetAuthorsByState" UpdateMethod="UpdateAuthor" DataObjectTypeName="Author" SortParameterName="sortExpression">
……
</asp:ObjectDataSource>
  下面的圖表顯示了GridView、ObjectDataSource和商務邏輯層之間的互動操作。ObjectDataSource被配置為調用ContactsList類型的GetContacts方法,返回Contact對象的集合。GridView列出了Contact對象,並直接綁定到該類型的屬性(ID, Name)來產生列。請注意,SelectMethod可以返回一個Contact對象的IEnumerable介面,或者返回單個Contact對象。如果本身沒有實現IEnumerable,ObjectDataSource會把SelectMethod返回的結果封裝到IEnumerable中。

  ObjectDataSource控制項與SqlDataSource類似,當SelectMethod 返回資料集、資料檢視或資料表對象的時候,它也支援排序功能。ObjectDataSource依賴資料檢視。在這個例子中Sort屬性執行排序操作。ObjectDataSource也支援SelectMethod實現中的自訂排序,如果該方法沒有返回資料集、資料檢視和資料表,它就非常有用。通過把SortParameterName屬性設定為從資料來源接受SortExpression的方法參數名稱,可以實現自訂排序。在調用SelectMethod的時候,ObjectDataSource會把這個運算式傳遞到你的方法中,你就可以使用這個運算式實現自己的排序邏輯。前面的例子示範了在AuthorsComponent類中自訂了一個排序實現。

  ObjectDataSource還支援SelectMethod實現中的自訂分頁功能。你需要使用StartRowIndexParameterName、MaximumRowsParameterName和SelectCountMethod屬性來設定它。
綁定到Visual Studio資料集

  綁定資料訪問層的操作可能很單調乏味,因為在DAL的不同方法中,執行SQL語句或預存程序的ADO.NET代碼時相同的或相似的。雖然你可以利用上述技術數用定製的ADO.NET代碼來編寫自己的DAL,Visual Studio還是提供了一條基於簡單的嚮導產生資料訪問層的方便途徑。在這種情況下,資料訪問層是強化類型的資料集對象。該資料集包含了TableAdapter類型,它暴露了用於返回強化類型的資料表對象的方法。這些方法適合於直接綁定到ObjectDataSource,或者在商務邏輯層組件中調用。

  為了給Visual Studio對象添加資料集,你需要右鍵點擊“解決方案瀏覽器”並選擇“添加新項”,接著選擇“資料集”項類型。Visual Studio給App_Code目錄添加了一個DataSet.xsd檔案,並開啟了DataSet 設計工具,載入了TableAdapter嚮導。你可以跟隨TableAdapter嚮導,指定資料庫中的SQL語句或預存程序,接著在嚮導的最後一個頁面中輸入與這些查詢/命令關聯的方法名稱。

  TableAdapter可以暴露兩個方法:Fill方法用於填充已有的資料集,Get方法返回一個已經填充好的資料表對象。前者更適合於Windows用戶端(在應用程式的生命週期中資料集儲存在記憶體中),而後者適合於ObjectDataSource。TableAdapter嚮導還為你提供的SQL選擇語句自動地產生了更新、插入和刪除方法(需要選擇主鍵)。在配置好嚮導之後,Visual Studio給DataSet 設計工具添加了一個新的資料表和TableAdapter類型。

  TableAdapter描述了單個結果集的大綱和大綱上的選擇、更新、插入或刪除操作。你可以通過在DataSet 設計工具中按右鍵,給資料集添加多個TableAdapter。你還可以右鍵點擊設計器中的TableAdapter框給TableAdapter添加額外的查詢(倘若它們返回相同的大綱)。例如,你的TableAdapter可能同時包含了GetAuthors()和GetAuthorsById(int id) 方法,但是如果要添加GetTitles()方法,可能需要添加一個新的TableAdapter。下圖顯示了添加了多個TableAdapter的DataSet 設計工具:

  你完成資料集的設計之後,就可以儲存DataSet.xsd檔案了(它引起該類型被設計器背景編譯,以供頁面使用)。你可以看到暴露給頁面代碼的這些類型:

protected void Page_Load(object sender, EventArgs e)
{
 DataSetTableAdapters.PhotosTableAdapter adapter = new  DataSetTableAdapters.PhotosTableAdapter();
 adapter.GetPhotosForAlbum(0);
}
  但是,你不需要從自己的代碼中調用這些方法。你可以把ObjectDataSource綁定到這些方法:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
TypeName="DataSetTableAdapters.PhotosTableAdapter"
SelectMethod="GetPhotosForAlbum">
<SelectParameters>
<asp:QueryStringParameter Name="albumID" QueryStringField="id" Type="Int32"/>
</SelectParameters>
</asp:ObjectDataSource>
  下面的例子示範了一個綁定到DataSet.TableAdapter方法的ObjectDataSource。在後面幾個例子中我們將使用這個資料集示範如何使用ASP.NET資料控制項實現一個簡單的相簿應用程式。請注意這個例子中的資料檢視使用了一個叫做ImageField的新欄位類型來顯示照片。我們還要注意,ObjectDataSource中使用的ConvertNullToDBNull會導致空參數值在傳遞給TableAdapter方法之前被轉換為DbNull(必須的)。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="DataComponentTableAdapters.AlbumsTableAdapter"
SelectMethod="GetAlbumsByOwner" UpdateMethod="Update" ConvertNullToDBNull="true" OldValuesParameterFormatString="original_{0}">
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" TypeName="DataComponentTableAdapters.OwnersTableAdapter" SelectMethod="GetOwners" />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.