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 个控件、一个 DropDownList 控件和一个 DetailsView 控件。 第一个 ObjectDataSource 控件和 DropDownList 控件用于检索和显示数据库中的员工姓名。 第二 ObjectDataSource 个控件和 DetailsView 控件用于检索、显示和修改用户选择的员工记录中的数据。

<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 事件的处理程序Selected。 事件处理程序 Selected 序列化对象,该对象包含从 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 标识的方法可以是实例方法,也可以是 static Visual Basic) Shared 方法中的 (。 如果是实例方法,则每次调用属性指定 UpdateMethod 的方法时,都会创建并销毁业务对象。 在调用 属性指定UpdateMethod的方法之前,可以处理 ObjectCreatedObjectCreating 事件以使用业务对象。 还可以处理在 ObjectDisposing 调用 属性指定 UpdateMethod 的方法后引发的事件。 如果业务对象实现 IDisposable 接口,则会在 Dispose 销毁对象之前调用 方法。 如果在 Visual Basic) Shared 中 (该方法static,则永远不会创建业务对象,并且无法处理 ObjectCreatedObjectCreatingObjectDisposing 事件。

参数合并

参数从三个 UpdateParameters 源添加到集合中:

  • 在运行时,从数据绑定控件。

  • 以声明方式从 UpdateParameters 元素。

  • Updating通过事件处理程序,以编程方式。

首先,从数据绑定控件生成的任何参数都会添加到集合中 UpdateParameters 。 例如,如果 控件ObjectDataSource绑定到GridView包含 列NameNumber的控件,则会将 和 Number 的参数Name添加到集合中。 参数的确切名称取决于 OldValuesParameterFormatString 属性。 这些参数的数据类型为 string。 接下来,添加 元素中列出的 UpdateParameters 参数。 如果发现元素中的 UpdateParameters 参数与集合中 UpdateParameters 已有的参数同名,则修改现有参数以匹配元素中指定的 UpdateParameters 参数。 通常,这用于修改 参数中的数据的类型。 最后,可以编程方式在 事件中添加 Updating 和删除参数,这在方法运行之前 Update 发生。 合并参数后,将解析 方法。 下一节将讨论方法解决方法。

重要

应验证从客户端接收的任何参数值。 运行时只是将参数值 UpdateMethod 替换为 属性。

方法解析

Update调用 方法时,数据绑定控件中的数据字段、在 元素中UpdateParameters以声明方式创建的参数以及添加到事件处理程序中的Updating参数将全部合并。 (有关详细信息,请参阅上一部分。) 然后,控件 ObjectDataSource 尝试查找要调用的方法。 首先,它查找具有 属性中指定的 UpdateMethod 名称的一个或多个方法。 如果未找到匹配项, InvalidOperationException 则会引发异常。 如果找到匹配项,则查找匹配的参数名称。 例如,假设 由 TypeName 属性指定的类型具有两个名为 UpdateARecord的方法。 一个 UpdateARecord 具有一个参数 ID, 另一个 UpdateARecord 具有两个参数, NameNumberUpdateParameters如果集合只有一个名为 的参数ID,则UpdateARecord调用仅ID具有 参数的方法。 在解析方法时不会检查参数的类型。 参数的顺序并不重要。

DataObjectTypeName如果设置了 属性,则以不同的方式解析方法。 ObjectDataSource查找具有在 属性中指定的UpdateMethod名称的方法,该方法采用 属性中指定的DataObjectTypeName类型的一个参数。 在这种情况下,参数的名称并不重要。

适用于

另请参阅