Compartilhar via


ObjectDataSource.UpdateMethod Propriedade

Definição

Obtém ou define o nome do método ou da função invocada pelo controle ObjectDataSource 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 da propriedade

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

Exemplos

Os três exemplos a seguir mostram uma página da Web, uma classe de página code-behind e uma classe de acesso a dados que permitem que um usuário recupere e atualize registros na tabela Funcionários no banco de dados Northwind.

O primeiro exemplo mostra uma página da Web que contém dois ObjectDataSource controles, um DropDownList controle e um DetailsView controle. O primeiro ObjectDataSource controle e o DropDownList controle são usados para recuperar e exibir nomes de funcionários do banco de dados. O segundo ObjectDataSource controle e o DetailsView controle são usados para recuperar, exibir e modificar os dados do registro de funcionário selecionado pelo usuário.

<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 manipuladores para os Selected eventos e Updating . O Selected manipulador de eventos serializa o objeto que contém dados recuperados da tabela Employee. O objeto serializado é armazenado no estado de exibição. O Updating manipulador de eventos desserializa o objeto no estado de exibição que contém os dados originais do registro de dados que está sendo atualizado. O objeto que contém os dados originais é passado como um parâmetro para o método Update. Os dados originais devem ser passados para o banco 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 a dados que interage com o banco de dados Northwind. A classe usa LINQ para consultar e atualizar a tabela Funcionários. O exemplo requer uma classe LINQ to SQL que representa o banco de dados Northwind e a tabela Employees. Para obter mais informações, consulte Como criar classes LINQ to SQL em um projeto Web.

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

Comentários

O ObjectDataSource controle pressupõe que o método identificado pela UpdateMethod propriedade executa atualizações uma de cada vez, em vez de em um lote.

A UpdateMethod propriedade delega à UpdateMethod propriedade do ObjectDataSourceView objeto associado ao ObjectDataSource controle .

Verifique se os nomes de parâmetro configurados para o ObjectDataSource controle na UpdateParameters coleção correspondem aos nomes de coluna retornados pelo método select.

Tempo de vida do objeto

O método identificado pela UpdateMethod propriedade pode ser um método de instância ou um static método (Shared no Visual Basic). Se for um método de instância, o objeto de negócios será criado e destruído sempre que o método especificado pela UpdateMethod propriedade for chamado. Você pode manipular os ObjectCreated eventos e ObjectCreating para trabalhar com o objeto de negócios antes que o método especificado pela UpdateMethod propriedade seja chamado. Você também pode lidar com o ObjectDisposing evento gerado após o método especificado pela UpdateMethod propriedade ser chamado. Se o objeto de negócios implementar a IDisposable interface, o Dispose método será chamado antes que o objeto seja destruído. Se o método for static (Shared no Visual Basic), o objeto de negócios nunca será criado e você não poderá manipular os ObjectCreatedeventos , ObjectCreatinge ObjectDisposing .

Mesclagem de parâmetro

Os parâmetros são adicionados à coleção de UpdateParameters três fontes:

  • No controle associado a dados, em tempo de execução.

  • UpdateParameters Do elemento , declarativamente.

  • Updating No manipulador de eventos, programaticamente.

Primeiro, todos os parâmetros gerados a partir de controles associados a dados são adicionados à UpdateParameters coleção. Por exemplo, se o ObjectDataSource controle estiver associado a um GridView controle que tem as colunas Name e Number, os parâmetros para Name e Number serão adicionados à coleção. O nome exato do parâmetro depende da OldValuesParameterFormatString propriedade . O tipo de dados desses parâmetros é string. Em seguida, os parâmetros listados no UpdateParameters elemento são adicionados. Se um parâmetro no UpdateParameters elemento for encontrado com o mesmo nome que um parâmetro que já está na UpdateParameters coleção, o parâmetro existente será modificado para corresponder ao parâmetro especificado no UpdateParameters elemento . Normalmente, isso é usado para modificar o tipo dos dados no parâmetro . Por fim, você pode adicionar e remover parâmetros programaticamente no evento, que Updating ocorre antes da execução do Update método. O método é resolvido depois que os parâmetros são mesclados. A resolução do método é discutida na próxima seção.

Importante

Você deve validar qualquer valor de parâmetro recebido do cliente. O runtime simplesmente substitui o valor do parâmetro na UpdateMethod propriedade .

Resolução de método

Quando o Update método é chamado, os campos de dados do controle associado a dados, os parâmetros que foram criados declarativamente no UpdateParameters elemento e os parâmetros que foram adicionados no Updating manipulador de eventos são todos mesclados. (Para obter mais informações, consulte a seção anterior.) Em ObjectDataSource seguida, o controle tenta encontrar um método para chamar. Primeiro, ele procura um ou mais métodos com o nome especificado na UpdateMethod propriedade . Se nenhuma correspondência for encontrada, uma exceção InvalidOperationException será gerada. Se uma correspondência for encontrada, ela procurará nomes de parâmetro correspondentes. Por exemplo, suponha que um tipo especificado pela TypeName propriedade tenha dois métodos chamados UpdateARecord. Um UpdateARecord tem um parâmetro, IDe o outro UpdateARecord tem dois parâmetros e NameNumber. Se a UpdateParameters coleção tiver apenas um parâmetro chamado ID, o UpdateARecord método com apenas o ID parâmetro será 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 estiver definida, o método será resolvido de uma maneira diferente. O ObjectDataSource procura um método com o nome especificado na UpdateMethod propriedade que usa um parâmetro do tipo especificado na DataObjectTypeName propriedade . Nesse caso, o nome do parâmetro não importa.

Aplica-se a

Confira também