ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

字號:


    一、ObjectDataSource 控件說明
    獲取或設(shè)置某個類的名稱,ObjectDataSource 控件將該類用于更新、插入或刪除數(shù)據(jù)操作中的參數(shù),而不是從數(shù)據(jù)綁定控件傳遞個別的值。
    您不用指定傳遞給 Update、Insert 和 Delete 方法的多個參數(shù),而是可以創(chuàng)建一個累計(jì)多個數(shù)據(jù)字段值的對象。僅給方法傳遞這一個對象,而不是多個參數(shù)。
    綁定到數(shù)據(jù)綁定控件的 ObjectDataSource 控件的默認(rèn)行為是,數(shù)據(jù)綁定控件為數(shù)據(jù)源中的每個參數(shù)創(chuàng)建一個 Parameter 對象。如果業(yè)務(wù)對象有很多字段,則結(jié)果方法也有很多字段。DataObjectTypeName 屬性允許您為每個數(shù)據(jù)字段都指定一個具有屬性的類型。這樣,運(yùn)行時(shí)不是給方法傳遞多個參數(shù),而是創(chuàng)建一個對象并設(shè)置它的所有屬性。這一個對象添加到方法調(diào)用的參數(shù)集合中。
    二、DataObjectTypeName 屬性的使用
    DataObjectTypeName 屬性指定的類型必須有一個不帶參數(shù)的默認(rèn)構(gòu)造函數(shù),以便 ObjectDataSource 控件可以創(chuàng)建此類型的實(shí)例。此類型還必須具有可設(shè)置的屬性,允許 ObjectDataSource 控件用數(shù)據(jù)綁定控件傳遞的值填充對象。ObjectDataSource 控件的屬性名應(yīng)該與數(shù)據(jù)綁定控件傳遞的值的參數(shù)名完全匹配。
    當(dāng)設(shè)置了 DataObjectTypeName 屬性并且 ObjectDataSource 控件與數(shù)據(jù)綁定控件關(guān)聯(lián)時(shí),由 InsertMethod 和 DeleteMethod 屬性指定的方法必須各有一個在 DataObjectTypeName 屬性中指定的類型的參數(shù)。如果 ConflictDetection 屬性設(shè)置為 OverwriteChanges 值,則由 UpdateMethod 屬性指定的方法必須有一個在 DataObjectTypeName 屬性中指定的類型的參數(shù)。如果 ConflictDetection 屬性設(shè)置為 CompareAllValues 值,則由 UpdateMethod 屬性指定的方法必須有兩個在 DataObjectTypeName 屬性中指定的類型的參數(shù)。第一個參數(shù)包含原始值;第二個參數(shù)包含新值。
    DataObjectTypeName 屬性委托給與 ObjectDataSource 控件關(guān)聯(lián)的 ObjectDataSourceView 的 DataObjectTypeName 屬性。
    三、示例代碼
    下面的代碼示例演示如何使用 DataObjectTypeName 屬性,實(shí)現(xiàn)一個將所有參數(shù)值合并為一個對象的類型。AggregateData 類的選擇方法返回一個有兩個名為 Name 和 Number 的列的 DataTable 對象。同樣,NewData 類定義兩個讀/寫屬性 Name 和 Number。AggregateData 類的 Insert 方法帶 NewData 類型的一個參數(shù)。ObjectDataSource 的 TypeName 屬性設(shè)置為 AggregateData,DataObjectTypeName 屬性設(shè)置為 NewData。
    前臺代碼:
    <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS" Assembly="Samples.AspNet.CS" %>
    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <script runat="server">
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
      <title>ObjectDataSource - DataObjectTypeName Property Example</title>
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
        <asp:DetailsView 
          ID="DetailsView1"
          runat="server"
          AllowPaging="True"
          AutoGenerateInsertButton="True"
          DataSourceID="ObjectDataSource1"
          Height="50px"
          Width="125px">
        </asp:DetailsView>
        <asp:ObjectDataSource 
          ID="ObjectDataSource1"
          runat="server"
          DataObjectTypeName="Samples.AspNet.CS.NewData"
          InsertMethod="Insert"
          SelectMethod="Select"
          TypeName="Samples.AspNet.CS.AggregateData">
        </asp:ObjectDataSource>
      </div>
      </form>
    </body>
    </html>
    后臺代碼:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    namespace Samples.AspNet.CS
    {
      /// <summary>
      /// Summary description for AggregateData
      /// </summary>
      public class AggregateData
      {
        public AggregateData()
        {
        }
        static DataTable table;
        private DataTable CreateData()
        {
          table = new DataTable();
          table.Columns.Add("Name", typeof(string));
          table.Columns.Add("Number", typeof(int));
          table.Rows.Add(new object[] { "one", 1 });
          table.Rows.Add(new object[] { "two", 2 });
          table.Rows.Add(new object[] { "three", 3 });
          return table;
        }
        public DataTable Select()
        {
          if (table == null)
          {
            return CreateData();
          }
          else
          {
            return table;
          }
        }
        public int Insert(NewData newRecord)
        {
          table.Rows.Add(new object[] { newRecord.Name, newRecord.Number });
          return 1;
        }
      }
      public class NewData
      {
        private string nameValue;
        private int numberValue;
        public string Name
        {
          get { return nameValue; }
          set { nameValue = value; }
        }
        public int Number
        {
          get { return numberValue; }
          set { numberValue = value; }
        }
      }
    }