ObjectDataSource.UpdateMethod Propriedade

Definição

Obtém ou define o nome do método ou função que o ObjectDataSource controlo invoca para atualizar os dados.

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 Propriedade

Uma cadeia que representa o nome do método ou função que o ObjectDataSource utilizador utiliza para atualizar os dados. O padrão é uma cadeia de caracteres vazia.

Exemplos

Os três exemplos seguintes mostram uma página Web, uma classe de página code-behind e uma classe de acesso a dados que permitem a um utilizador recuperar e atualizar registos na tabela Employees da base de dados Northwind.

O primeiro exemplo mostra uma página Web que contém dois ObjectDataSource controlos, um DropDownList controlo e um DetailsView controlo. O primeiro ObjectDataSource controlo e o controlo DropDownList são usados para recuperar e mostrar os nomes dos funcionários da base de dados. O segundo ObjectDataSource controlo e o DetailsView controlo são usados para recuperar, mostrar e modificar os dados do registo do empregado selecionado pelo utilizador.

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

O segundo exemplo mostra os condutores para os Selected eventos e Updating . O Selected gestor de eventos serializa o objeto que contém dados recuperados da tabela Employee. O objeto serializado é armazenado no estado de visualização. O Updating gestor de eventos desserializa o objeto no estado de visualização que contém os dados originais do registo de dados que está a ser atualizado. O objeto que contém os dados originais é passado como parâmetro ao método Update. Os dados originais devem ser passados para a base de dados para que possam ser usados para verificar se os dados foram modificados por outro processo.

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

O terceiro exemplo mostra a classe de acesso aos dados que interage com a base de dados Northwind. A classe utiliza o LINQ para consultar e atualizar a tabela Employees. O exemplo requer uma classe LINQ para SQL que represente a base de dados Northwind e a tabela Employees. Para mais informações, veja Como: Criar Classes LINQ para SQL numa 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

Observações

O ObjectDataSource controlo assume que o método identificado pela UpdateMethod propriedade realiza atualizações uma de cada vez, em vez de em lote.

A UpdateMethod propriedade delega à UpdateMethod propriedade do ObjectDataSourceView objeto associada ao ObjectDataSource controlo.

Certifique-se de que os nomes dos parâmetros configurados para o ObjectDataSource controlo na UpdateParameters coleção correspondem aos nomes das colunas retornados pelo método select.

Tempo de vida do objeto

O método identificado pela propriedade UpdateMethod pode ser um método de instância ou um método static (Shared em Visual Basic). Se for um método de instância, o objeto de negócio é criado e destruído cada vez que o método especificado pela UpdateMethod propriedade é chamado. Pode gerir os ObjectCreated eventos e ObjectCreating para trabalhar com o objeto de negócio antes de ser chamado o método especificado pela UpdateMethod propriedade. Também pode tratar do ObjectDisposing evento que é levantado após o método especificado pela UpdateMethod propriedade ser chamado. Se o objeto de negócio implementar a IDisposable interface, o Dispose método é chamado antes de o objeto ser destruído. Se o método for static (Shared em Visual Basic), o objeto de negócio nunca é criado e não pode gerir os eventos ObjectCreated, ObjectCreating e ObjectDisposing.

Fusão de parâmetros

Parâmetros são adicionados à UpdateParameters coleção a partir de três fontes:

  • A partir do controlo data-bound, em tempo de execução.

  • Do UpdateParameters elemento, de forma declarativa.

  • Do Updating gestor de eventos, programaticamente.

Primeiro, quaisquer parâmetros gerados a partir de controlos ligados a dados são adicionados à UpdateParameters coleção. Por exemplo, se o controlo ObjectDataSource estiver ligado a um GridView controlo que tenha as colunas Name e Number, os parâmetros para Name e Number são adicionados à coleção. O nome exato do parâmetro depende da propriedade OldValuesParameterFormatString . O tipo de dados destes parâmetros é string. De seguida, os parâmetros listados no UpdateParameters elemento são adicionados. Se um parâmetro no UpdateParameters elemento for encontrado com o mesmo nome de um parâmetro que já está na UpdateParameters coleção, o parâmetro existente é modificado para corresponder ao parâmetro especificado no UpdateParameters elemento. Normalmente, isto é usado para modificar o tipo de dados no parâmetro. Finalmente, pode adicionar e remover parâmetros programaticamente no Updating evento, o que ocorre antes do Update método ser executado. O método é resolvido após a fusão dos parâmetros. A resolução do método é discutida na secção seguinte.

Importante

Deve validar qualquer valor de parâmetro que receba do cliente. O tempo de execução simplesmente substitui o valor do parâmetro pela UpdateMethod propriedade.

Resolução do Método

Quando o Update método é chamado, os campos de dados do controlo data-bound, os parâmetros criados declarativamente no UpdateParameters elemento e os parâmetros adicionados no Updating handler de eventos são todos fundidos. (Para mais informações, consulte a secção anterior.) O ObjectDataSource controlo tenta então encontrar um método para chamar. Primeiro, procura um ou mais métodos com o nome especificado na UpdateMethod propriedade. Se não for encontrada correspondência, é lançada uma InvalidOperationException exceção. Se for encontrada uma correspondência, procura então nomes de parâmetros correspondentes. Por exemplo, suponha que um tipo especificado pela TypeName propriedade tem dois métodos chamados UpdateARecord. Um UpdateARecord tem um parâmetro, ID, e o outro UpdateARecord tem dois parâmetros, Name e Number. Se a UpdateParameters coleção tiver apenas um parâmetro chamado ID, o UpdateARecord método com apenas o ID parâmetro é chamado. O tipo do parâmetro não é verificado na resolução dos métodos. A ordem dos parâmetros não importa.

Se a DataObjectTypeName propriedade for definida, o método é resolvido de forma diferente. Procura ObjectDataSource um método com o nome especificado na UpdateMethod propriedade que toma um parâmetro do tipo especificado na DataObjectTypeName propriedade. Neste caso, o nome do parâmetro não importa.

Aplica-se a

Ver também