ObjectDataSource.UpdateMethod 屬性

定義

取得或設定 ObjectDataSource 控制項叫用以更新資料之方法或函式的名稱。

public:
 property System::String ^ UpdateMethod { System::String ^ get(); void set(System::String ^ value); };
public string UpdateMethod { get; set; }
member this.UpdateMethod : string with get, set
Public Property UpdateMethod As String

屬性值

字串,表示 ObjectDataSource 用於更新資料之方法或函式的名稱。 預設為空字串。

範例

下列三個範例顯示網頁、程式碼後置頁面類別,以及資料存取類別,讓使用者能夠擷取和更新 Northwind 資料庫中 Employees 資料表中的記錄。

第一個範例顯示包含兩 ObjectDataSource 個控制項、一個控制項和一個 DropDownListDetailsView 控制項的網頁。 第一個 ObjectDataSource 控制項和 DropDownList 控制項是用來擷取和顯示資料庫中的員工名稱。 第二 ObjectDataSourceDetailsView 控制項和 控制項是用來擷取、顯示和修改使用者所選取員工記錄中的資料。

<form id="Form1" method="post" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>
<form id="form1" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>

第二個範例顯示 和 Updating 事件的處理常式 SelectedSelected事件處理常式會序列化 物件,其中包含從 Employee 資料表擷取的資料。 序列化物件會儲存在檢視狀態中。 事件處理常式會 Updating 以檢視狀態還原序列化物件,其中包含正在更新之資料記錄的原始資料。 包含原始資料的物件會當做參數傳遞至 Update 方法。 原始資料必須傳遞至資料庫,以便用來檢查資料是否已由另一個進程修改。

public void EmployeeUpdating(object source, ObjectDataSourceMethodEventArgs e)
{
    DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));

    String xmlData = ViewState["OriginalEmployee"].ToString();
    XmlReader reader = XmlReader.Create(new StringReader(xmlData));
    Employee originalEmployee = (Employee)dcs.ReadObject(reader);
    reader.Close();

    e.InputParameters.Add("originalEmployee", originalEmployee);
}

public void EmployeeSelected(object source, ObjectDataSourceStatusEventArgs e)
{
    if (e.ReturnValue != null)
    {
        DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));
        StringBuilder sb = new StringBuilder();
        XmlWriter writer = XmlWriter.Create(sb);
        dcs.WriteObject(writer, e.ReturnValue);
        writer.Close();

        ViewState["OriginalEmployee"] = sb.ToString();
    }
}
Public Sub EmployeeUpdating(ByVal source As Object, ByVal e As ObjectDataSourceMethodEventArgs)
    Dim dcs As New DataContractSerializer(GetType(Employee))
    Dim xmlData As String
    Dim reader As XmlReader
    Dim originalEmployee As Employee

    xmlData = ViewState("OriginalEmployee").ToString()
    reader = XmlReader.Create(New StringReader(xmlData))
    originalEmployee = CType(dcs.ReadObject(reader), Employee)
    reader.Close()

    e.InputParameters.Add("originalEmployee", originalEmployee)
End Sub

Public Sub EmployeeSelected(ByVal source As Object, ByVal e As ObjectDataSourceStatusEventArgs)
    If e.ReturnValue IsNot Nothing Then
        Dim dcs As New DataContractSerializer(GetType(Employee))
        Dim sb As New StringBuilder()
        Dim writer As XmlWriter
        writer = XmlWriter.Create(sb)
        dcs.WriteObject(writer, e.ReturnValue)
        writer.Close()

        ViewState("OriginalEmployee") = sb.ToString()
    End If
End Sub

第三個範例顯示與 Northwind 資料庫互動的資料存取類別。 類別會使用 LINQ 來查詢及更新 Employees 資料表。 此範例需要代表 Northwind 資料庫和 Employees 資料表的 LINQ to SQL 類別。 如需詳細資訊,請參閱如何:在 Web 專案中建立LINQ to SQL類別

public class EmployeeLogic
{
    public static Array GetFullNamesAndIDs()
    {
        NorthwindDataContext ndc = new NorthwindDataContext();

        var employeeQuery =
            from e in ndc.Employees
            orderby e.LastName
            select new { FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID };

        return employeeQuery.ToArray();
    }

    public static Employee GetEmployee(int empID)
    {
        if (empID < 0)
        {
            return null;
        }
        else
        {
            NorthwindDataContext ndc = new NorthwindDataContext();
            var employeeQuery =
                from e in ndc.Employees
                where e.EmployeeID == empID
                select e;

            return employeeQuery.Single();
        }
    }
 
    public static void UpdateEmployeeAddress(Employee originalEmployee, string address, string city, string postalcode)
    {
        NorthwindDataContext ndc = new NorthwindDataContext();
        ndc.Employees.Attach(originalEmployee, false);
        originalEmployee.Address = address;
        originalEmployee.City = city;
        originalEmployee.PostalCode = postalcode;
        ndc.SubmitChanges();
    }
}
Public Class EmployeeLogic
    Public Shared Function GetFullNamesAndIDs() As Array
        Dim ndc As New NorthwindDataContext()

        Dim employeeQuery = _
            From e In ndc.Employees _
            Order By e.LastName _
            Select FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID

        Return employeeQuery.ToArray()
    End Function

    Public Shared Function GetEmployee(ByVal empID As Integer) As Employee

        If (empID < 0) Then
            Return Nothing
        Else
            Dim ndc As New NorthwindDataContext()
            Dim employeeQuery = _
                From e In ndc.Employees _
                Where e.EmployeeID = empID _
                Select e

            Return employeeQuery.Single()
        End If
    End Function

    Public Shared Sub UpdateEmployeeAddress(ByVal originalEmployee As Employee, ByVal address As String, ByVal city As String, ByVal postalcode As String)

        Dim ndc As New NorthwindDataContext()
        ndc.Employees.Attach(originalEmployee, False)
        originalEmployee.Address = address
        originalEmployee.City = city
        originalEmployee.PostalCode = postalcode
        ndc.SubmitChanges()
    End Sub
End Class

備註

控制項 ObjectDataSource 假設 屬性所 UpdateMethod 識別的方法會一次執行一個更新,而不是批次中的更新。

屬性 UpdateMethod 會委派給 UpdateMethodObjectDataSource 控制項相關聯之 ObjectDataSourceView 物件的 屬性。

請確定為 ObjectDataSource 集合中 UpdateParameters 控制項設定的參數名稱符合 select 方法所傳回的資料行名稱。

物件存留期

屬性所 UpdateMethod 識別的方法可以是 Visual Basic) 方法中的實例方法或 static (Shared 。 如果是實例方法,每次呼叫 屬性所 UpdateMethod 指定的方法時,都會建立並終結商務物件。 您可以在呼叫 屬性所 UpdateMethod 指定的 方法之前,先處理 ObjectCreatedObjectCreating 事件以使用商務物件。 您也可以處理 ObjectDisposing 呼叫 屬性所 UpdateMethod 指定之 方法之後所引發的事件。 如果商務物件實作 IDisposable 介面,則會 Dispose 在終結物件之前呼叫 方法。 如果在 Visual Basic) 中 (方法 static ,則永遠不會建立商務物件,而且您無法處理 ObjectCreatedObjectCreatingObjectDisposing 事件。 Shared

參數合併

參數會從三個來源新增至 UpdateParameters 集合:

  • 從資料繫結控制項,在執行時間。

  • UpdateParameters以宣告方式從 專案。

  • Updating從事件處理常式,以程式設計方式。

首先,從資料繫結控制項產生的任何參數都會新增至 UpdateParameters 集合。 例如,如果 ObjectDataSource 控制項系結至 GridView 具有 資料行 Name 和 的控制項,則 和 Number 的參數 NameNumber 會加入至集合中。 參數的確切名稱取決於 OldValuesParameterFormatString 屬性。 這些參數的資料類型為 string 。 接下來,會新增專案中列出的 UpdateParameters 參數。 如果找到元素中的 UpdateParameters 參數與集合中 UpdateParameters 已存在的參數名稱相同,則會修改現有的參數,以符合 元素中指定的 UpdateParameters 參數。 一般而言,這會用來修改 參數中的資料型別。 最後,您可以程式設計方式在 事件中 Updating 新增和移除參數,這會在執行 方法之前 Update 發生。 方法會在合併參數之後解析。 下一節會討論方法解析。

重要

您應該驗證您從用戶端收到的任何參數值。 執行時間只會將參數值取代為 UpdateMethod 屬性。

方法解析

Update呼叫 方法時,來自資料繫結控制項的資料欄位、以宣告方式在 元素中 UpdateParameters 建立的參數,以及事件處理常式中 Updating 新增的參數都會合並。 (如需詳細資訊,請參閱上一節。) ObjectDataSource 控制項接著會嘗試尋找要呼叫的方法。 首先,它會尋找具有 屬性中所 UpdateMethod 指定名稱的一或多個方法。 如果找不到相符專案, InvalidOperationException 則會擲回例外狀況。 如果找到相符專案,則會尋找相符的參數名稱。 例如,假設 屬性所 TypeName 指定的型別有兩個名為 UpdateARecord 的方法。 其中一 UpdateARecord 個參數為 ,另一個參數則有兩個 IDUpdateARecord 參數, NameNumberUpdateParameters如果集合只有一個名為 ID 的參數, UpdateARecord 則只會 ID 呼叫具有 參數的方法。 無法檢查參數的類型,無法解析方法。 參數的順序並不重要。

DataObjectTypeName如果已設定 屬性,方法會以不同方式解析。 會 ObjectDataSource 尋找名稱在 屬性中指定的 UpdateMethod 方法,該方法會採用 屬性中所 DataObjectTypeName 指定類型的一個參數。 在此情況下,參數的名稱並不重要。

適用於

另請參閱