ObjectDataSource.UpdateMethod Propiedad

Definición

Obtiene o establece el nombre del método o la función que invoca el control ObjectDataSource para actualizar los datos.

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

Valor de propiedad

Cadena que representa el nombre del método o función que usa el objeto ObjectDataSource para actualizar datos. El valor predeterminado es una cadena vacía.

Ejemplos

En los tres ejemplos siguientes se muestra una página web, una clase de página de código subyacente y una clase de acceso a datos que permite a un usuario recuperar y actualizar registros en la tabla Employees de la base de datos Northwind.

En el primer ejemplo se muestra una página web que contiene dos ObjectDataSource controles, un DropDownList control y un DetailsView control . El primer ObjectDataSource control y el DropDownList control se usan para recuperar y mostrar nombres de empleados de la base de datos. El segundo ObjectDataSource control y el DetailsView control se usan para recuperar, mostrar y modificar los datos del registro de empleado seleccionado por el usuario.

<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>

En el segundo ejemplo se muestran los controladores de los Selected eventos y Updating . El Selected controlador de eventos serializa el objeto que contiene los datos recuperados de la tabla Employee. El objeto serializado se almacena en estado de vista. El Updating controlador de eventos deserializa el objeto en estado de vista que contiene los datos originales del registro de datos que se está actualizando. El objeto que contiene los datos originales se pasa como parámetro al método Update. Los datos originales se deben pasar a la base de datos para que se puedan usar para comprobar si otro proceso ha modificado los datos.

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

En el tercer ejemplo se muestra la clase de acceso a datos que interactúa con la base de datos Northwind. La clase usa LINQ para consultar y actualizar la tabla Employees. En el ejemplo se requiere una clase LINQ to SQL que representa la base de datos Northwind y la tabla Employees. Para obtener más información, vea How to: Create LINQ to SQL Classes in a Web Project.

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

Comentarios

El ObjectDataSource control supone que el método identificado por la UpdateMethod propiedad realiza actualizaciones de una en una, en lugar de en un lote.

La UpdateMethod propiedad delega a la UpdateMethod propiedad del ObjectDataSourceView objeto asociado al ObjectDataSource control .

Asegúrese de que los nombres de parámetro configurados para el ObjectDataSource control de la UpdateParameters colección coinciden con los nombres de columna devueltos por el método select.

Duración de objetos

El método identificado por la UpdateMethod propiedad puede ser un método de instancia o un static método (Shared en Visual Basic). Si es un método de instancia, se crea y destruye el objeto de negocio cada vez que se llama al método especificado por la UpdateMethod propiedad . Puede controlar los ObjectCreated eventos y ObjectCreating para trabajar con el objeto de negocio antes de llamar al método especificado por la UpdateMethod propiedad . También puede controlar el ObjectDisposing evento que se genera después de llamar al método especificado por la UpdateMethod propiedad . Si el objeto de negocio implementa la IDisposable interfaz , se llama al Dispose método antes de que se destruya el objeto. Si el método es static (Shared en Visual Basic), el objeto de negocio nunca se crea y no se pueden controlar los ObjectCreatedeventos , ObjectCreatingy ObjectDisposing .

Combinación de parámetros

Los parámetros se agregan a la UpdateParameters colección de tres orígenes:

  • Desde el control enlazado a datos, en tiempo de ejecución.

  • Desde el UpdateParameters elemento , mediante declaración.

  • Desde el Updating controlador de eventos, mediante programación.

En primer lugar, los parámetros generados a partir de controles enlazados a datos se agregan a la UpdateParameters colección. Por ejemplo, si el ObjectDataSource control está enlazado a un GridView control que tiene las columnas y Number, los parámetros Name de Name y Number se agregan a la colección. El nombre exacto del parámetro depende de la OldValuesParameterFormatString propiedad . El tipo de datos de estos parámetros es string. A continuación, se agregan los parámetros que aparecen en el UpdateParameters elemento . Si se encuentra un parámetro en el UpdateParameters elemento con el mismo nombre que un parámetro que ya está en la UpdateParameters colección, el parámetro existente se modifica para que coincida con el parámetro especificado en el UpdateParameters elemento. Normalmente, se usa para modificar el tipo de datos en el parámetro . Por último, puede agregar y quitar parámetros mediante programación en el Updating evento , que se produce antes de que se ejecute el Update método. El método se resuelve después de combinar los parámetros. La resolución de métodos se describe en la sección siguiente.

Importante

Debe validar cualquier valor de parámetro que reciba del cliente. El tiempo de ejecución simplemente sustituye el valor del parámetro a la UpdateMethod propiedad .

Resolución de métodos

Cuando se llama al Update método , los campos de datos del control enlazado a datos, los parámetros que se crearon declarativamente en el UpdateParameters elemento y los parámetros que se agregaron en el Updating controlador de eventos se combinan. (Para obtener más información, consulte la sección anterior). A continuación, el ObjectDataSource control intenta buscar un método al que se va a llamar. En primer lugar, busca uno o varios métodos con el nombre especificado en la UpdateMethod propiedad . Si no se encuentra ninguna coincidencia, se produce una InvalidOperationException excepción. Si se encuentra una coincidencia, busca nombres de parámetro coincidentes. Por ejemplo, supongamos que un tipo especificado por la TypeName propiedad tiene dos métodos denominados UpdateARecord. Uno UpdateARecord tiene un parámetro, ID, y el otro UpdateARecord tiene dos parámetros, Name y Number. Si la UpdateParameters colección solo tiene un parámetro denominado ID, se UpdateARecord llama al método con solo el ID parámetro . El tipo del parámetro no se comprueba al resolver los métodos. El orden de los parámetros no importa.

Si se establece la DataObjectTypeName propiedad , el método se resuelve de otra manera. ObjectDataSource busca un método con el nombre especificado en la UpdateMethod propiedad que toma un parámetro del tipo especificado en la DataObjectTypeName propiedad . En este caso, el nombre del parámetro no importa.

Se aplica a

Consulte también