ObjectDataSource.UpdateMethod Propriedade
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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, ID
e o outro UpdateARecord
tem dois parâmetros e Name
Number
. 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.