ObjectDataSource.UpdateMethod Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pobiera lub ustawia nazwę metody lub funkcji wywoływanej ObjectDataSource przez kontrolkę w celu zaktualizowania danych.
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
Wartość właściwości
Ciąg reprezentujący nazwę metody lub funkcji używanej ObjectDataSource do aktualizowania danych. Wartość domyślna to pusty ciąg.
Przykłady
W poniższych trzech przykładach pokazano stronę sieci Web, klasę stron za pomocą kodu i klasę dostępu do danych, która umożliwia użytkownikowi pobieranie i aktualizowanie rekordów w tabeli Employees w bazie danych Northwind.
W pierwszym przykładzie przedstawiono stronę sieci Web zawierającą dwie ObjectDataSource kontrolki, kontrolkę DropDownList i kontrolkę DetailsView . Pierwsza ObjectDataSource kontrolka i kontrolka DropDownList służą do pobierania i wyświetlania nazw pracowników z bazy danych. Druga ObjectDataSource kontrolka i kontrolka DetailsView służą do pobierania, wyświetlania i modyfikowania danych z rekordu pracownika wybranego przez użytkownika.
<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>
W drugim przykładzie przedstawiono programy obsługi dla zdarzeń Selected i .Updating Program Selected obsługi zdarzeń serializuje obiekt zawierający dane pobrane z tabeli Employee. Serializowany obiekt jest przechowywany w stanie widoku. Program Updating obsługi zdarzeń deserializuje obiekt w stanie widoku zawierającym oryginalne dane dla aktualizowanego rekordu danych. Obiekt zawierający oryginalne dane jest przekazywany jako parametr do metody Update. Oryginalne dane muszą zostać przekazane do bazy danych, aby można było go użyć do sprawdzenia, czy dane zostały zmodyfikowane przez inny proces.
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
Trzeci przykład przedstawia klasę dostępu do danych, która współdziała z bazą danych Northwind. Klasa używa LINQ do wykonywania zapytań i aktualizowania tabeli Employees. Przykład wymaga klasy LINQ to SQL reprezentującej bazę danych Northwind i tabelę Employees. Aby uzyskać więcej informacji, zobacz How to: Create LINQ to SQL Classes in a Web Project (Instrukcje: tworzenie klas LINQ to SQL w projekcie internetowym).
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
Uwagi
Kontrolka ObjectDataSource zakłada, że metoda identyfikowana przez UpdateMethod właściwość wykonuje aktualizacje pojedynczo, a nie w partii.
Właściwość UpdateMethod deleguje do UpdateMethod właściwości obiektu skojarzonego ObjectDataSourceView z kontrolką ObjectDataSource .
Upewnij się, że nazwy parametrów skonfigurowane dla ObjectDataSource kontrolki w UpdateParameters kolekcji są zgodne z nazwami kolumn zwracanych przez metodę select.
Okres istnienia obiektu
Metoda, która jest identyfikowana przez UpdateMethod właściwość, może być metodą wystąpienia lub static
(Shared
w Visual Basic). Jeśli jest to metoda wystąpienia, obiekt biznesowy jest tworzony i niszczony za każdym razem, gdy metoda określona przez UpdateMethod właściwość jest wywoływana. Zdarzenia i można obsługiwaćObjectCreated, aby pracować z obiektem biznesowym, zanim zostanie wywołana metoda określona UpdateMethod przez właściwość.ObjectCreating Można również obsłużyć ObjectDisposing zdarzenie, które jest wywoływane po wywołaniu metody określonej przez UpdateMethod właściwość. Jeśli obiekt biznesowy implementuje IDisposable interfejs, Dispose metoda jest wywoływana przed zniszczeniem obiektu. Jeśli metoda to static
(Shared
w Visual Basic), obiekt biznesowy nigdy nie jest tworzony i nie można obsłużyć ObjectCreatedzdarzeń , i .ObjectDisposingObjectCreating
Scalanie parametrów
Parametry są dodawane do kolekcji UpdateParameters z trzech źródeł:
Z kontrolki powiązanej z danymi w czasie wykonywania.
UpdateParameters
Z elementu deklaratywnie.Programowo z programu obsługi zdarzeń Updating .
Najpierw wszystkie parametry generowane na podstawie kontrolek powiązanych z danymi są dodawane do kolekcji UpdateParameters . Jeśli na przykład kontrolka ObjectDataSource jest powiązana z kontrolką zawierającą GridView kolumny Name
i , parametry i Number
Name
Number
są dodawane do kolekcji. Dokładna nazwa parametru zależy od OldValuesParameterFormatString właściwości. Typ danych tych parametrów to string
. Następnie zostaną dodane parametry wymienione w UpdateParameters
elemecie . Jeśli parametr w UpdateParameters
elemecie zostanie znaleziony o takiej samej nazwie jak parametr, który znajduje się już w UpdateParameters kolekcji, istniejący parametr zostanie zmodyfikowany tak, aby był zgodny z parametrem określonym w UpdateParameters
elemecie . Zazwyczaj jest to używane do modyfikowania typu danych w parametrze . Na koniec można programowo dodać i usunąć parametry w Updating zdarzeniu, które występuje przed uruchomieniem Update metody. Metoda jest rozpoznawana po scaleniu parametrów. Rozwiązanie metody zostało omówione w następnej sekcji.
Ważne
Należy zweryfikować dowolną wartość parametru otrzymaną od klienta. Środowisko uruchomieniowe po prostu zastępuje wartość parametru UpdateMethod do właściwości .
Rozwiązanie metody
Po wywołaniu Update metody pola danych z kontrolki powiązanej z danymi, parametry utworzone deklaratywnie w UpdateParameters
elemecie i parametry dodane w procedurze Updating obsługi zdarzeń są scalane. (Aby uzyskać więcej informacji, zobacz poprzednią sekcję). Następnie kontrolka ObjectDataSource próbuje znaleźć metodę do wywołania. Najpierw wyszukuje co najmniej jedną metodę o nazwie określonej we UpdateMethod właściwości. Jeśli nie zostanie znalezione dopasowanie, InvalidOperationException zostanie zgłoszony wyjątek. Jeśli zostanie znalezione dopasowanie, szuka pasujących nazw parametrów. Załóżmy na przykład, że typ określony przez TypeName właściwość ma dwie metody o nazwie UpdateARecord
. Jeden z nich UpdateARecord
ma jeden parametr , ID
a drugi UpdateARecord
ma dwa parametry Name
i Number
.
UpdateParameters Jeśli kolekcja ma tylko jeden parametr o nazwie ID
, UpdateARecord
metoda z tylko parametrem jest wywoływanaID
. Typ parametru nie jest sprawdzany podczas rozpoznawania metod. Kolejność parametrów nie ma znaczenia.
DataObjectTypeName Jeśli właściwość jest ustawiona, metoda jest rozpoznawana w inny sposób. Szuka ObjectDataSource metody o nazwie określonej we UpdateMethod właściwości, która przyjmuje jeden parametr typu określonego DataObjectTypeName we właściwości. W takim przypadku nazwa parametru nie ma znaczenia.