ObjectDataSource.UpdateMethod Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
UpdateParameterselemento, 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.