ObjectDataSource.UpdateMethod Eigenschaft
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft den Namen der Methode oder der Funktion ab, die vom ObjectDataSource-Steuerelement zum Aktualisieren von Daten aufgerufen wird, oder legt diesen fest.
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
Eigenschaftswert
Eine Zeichenfolge, die den Namen der Methode oder der Funktion darstellt, mit deren Hilfe die ObjectDataSource Daten aktualisiert. Der Standardwert ist eine leere Zeichenfolge.
Beispiele
Die folgenden drei Beispiele zeigen eine Webseite, eine CodeBehind-Seitenklasse und eine Datenzugriffsklasse, mit der ein Benutzer Datensätze in der Tabelle Employees in der Northwind-Datenbank abrufen und aktualisieren kann.
Das erste Beispiel zeigt eine Webseite, die zwei ObjectDataSource Steuerelemente enthält, ein DropDownList -Steuerelement und ein DetailsView -Steuerelement. Das erste ObjectDataSource Steuerelement und das DropDownList Steuerelement werden verwendet, um Mitarbeiternamen aus der Datenbank abzurufen und anzuzeigen. Das zweite ObjectDataSource Steuerelement und das DetailsView Steuerelement werden verwendet, um die Daten aus dem vom Benutzer ausgewählten Mitarbeiterdatensatz abzurufen, anzuzeigen und zu ändern.
<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>
Das zweite Beispiel zeigt Handler für die Selected Ereignisse und Updating . Der Selected Ereignishandler serialisiert das Objekt, das Daten enthält, die aus der Employee-Tabelle abgerufen wurden. Das serialisierte Objekt wird im Ansichtszustand gespeichert. Der Updating Ereignishandler deserialisiert das Objekt im Ansichtszustand, der die ursprünglichen Daten für den zu aktualisierenden Datensatz enthält. Das Objekt, das die ursprünglichen Daten enthält, wird als Parameter an die Update-Methode übergeben. Die ursprünglichen Daten müssen an die Datenbank übergeben werden, damit sie verwendet werden können, um zu überprüfen, ob die Daten von einem anderen Prozess geändert wurden.
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
Das dritte Beispiel zeigt die Datenzugriffsklasse, die mit der Northwind-Datenbank interagiert. Die -Klasse verwendet LINQ, um die Employees-Tabelle abzufragen und zu aktualisieren. Das Beispiel erfordert eine LINQ to SQL-Klasse, die die Northwind-Datenbank und die Employees-Tabelle darstellt. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von LINQ to SQL-Klassen in einem Webprojekt.
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
Hinweise
Das ObjectDataSource Steuerelement geht davon aus, dass die von der UpdateMethod -Eigenschaft identifizierte Methode updates einzeln und nicht in einem Batch ausführt.
Die UpdateMethod -Eigenschaft delegiert die UpdateMethod Eigenschaft des ObjectDataSourceView Objekts, das dem ObjectDataSource Steuerelement zugeordnet ist.
Stellen Sie sicher, dass die für das Steuerelement in der ObjectDataSourceUpdateParameters Auflistung konfigurierten Parameternamen mit den Spaltennamen übereinstimmen, die von der select-Methode zurückgegeben werden.
Lebensdauer eines Objekts
Die von der UpdateMethod -Eigenschaft identifizierte Methode kann eine Instanzmethode oder eine static
(Shared
in Visual Basic) Methode sein. Wenn es sich um eine Instanzmethode handelt, wird das Geschäftsobjekt jedes Mal erstellt und zerstört, wenn die von der UpdateMethod -Eigenschaft angegebene Methode aufgerufen wird. Sie können die ObjectCreated Ereignisse und ObjectCreating behandeln, um mit dem Geschäftsobjekt zu arbeiten, bevor die von der UpdateMethod -Eigenschaft angegebene Methode aufgerufen wird. Sie können auch das ObjectDisposing Ereignis behandeln, das ausgelöst wird, nachdem die von der UpdateMethod -Eigenschaft angegebene Methode aufgerufen wird. Wenn das Geschäftsobjekt die IDisposable Schnittstelle implementiert, wird die Dispose -Methode aufgerufen, bevor das Objekt zerstört wird. Wenn die -Methode (Shared
in Visual Basic) lautet static
, wird das Geschäftsobjekt nie erstellt, und Sie können die ObjectCreatedEreignisse , ObjectCreatingund ObjectDisposing nicht verarbeiten.
Parameterzusammenführung
Parameter werden der UpdateParameters Auflistung aus drei Quellen hinzugefügt:
Aus dem datengebundenen Steuerelement zur Laufzeit.
Deklarativ aus dem
UpdateParameters
Element.Programmgesteuert aus dem Updating Ereignishandler.
Zunächst werden alle Parameter, die aus datengebundenen Steuerelementen generiert werden, der UpdateParameters Auflistung hinzugefügt. Wenn das ObjectDataSource Steuerelement beispielsweise an ein GridView Steuerelement gebunden ist, das die Spalten Name
und Number
enthält, werden die Parameter für Name
und Number
der Auflistung hinzugefügt. Der genaue Name des Parameters hängt von der OldValuesParameterFormatString -Eigenschaft ab. Der Datentyp dieser Parameter ist string
. Als Nächstes werden die Parameter hinzugefügt, die UpdateParameters
im -Element aufgeführt sind. Wenn ein Parameter im UpdateParameters
-Element mit demselben Namen gefunden wird wie ein Parameter, der sich bereits in der UpdateParameters Auflistung befindet, wird der vorhandene Parameter so geändert, dass er mit dem im UpdateParameters
-Element angegebenen Parameter übereinstimmt. In der Regel wird dies verwendet, um den Typ der Daten im Parameter zu ändern. Schließlich können Sie parameter in dem Updating Ereignis programmgesteuert hinzufügen und entfernen, das vor der Ausführung der Update Methode auftritt. Die -Methode wird aufgelöst, nachdem die Parameter zusammengeführt wurden. Die Methodenauflösung wird im nächsten Abschnitt erläutert.
Wichtig
Sie sollten jeden Parameterwert überprüfen, den Sie vom Client erhalten. Die Runtime ersetzt einfach den Parameterwert in der UpdateMethod -Eigenschaft.
Methodenauflösung
Wenn die Update Methode aufgerufen wird, werden die Datenfelder aus dem datengebundenen Steuerelement, die Parameter, die deklarativ im UpdateParameters
Element erstellt wurden, und die Parameter, die Updating im Ereignishandler hinzugefügt wurden, zusammengeführt. (Weitere Informationen finden Sie im vorherigen Abschnitt.) Das ObjectDataSource Steuerelement versucht dann, eine methode zu finden, die aufgerufen werden soll. Zunächst wird nach einer oder mehreren Methoden mit dem in der UpdateMethod -Eigenschaft angegebenen Namen gesucht. Wenn keine Übereinstimmung gefunden wird, wird eine InvalidOperationException Ausnahme ausgelöst. Wenn eine Übereinstimmung gefunden wird, wird nach übereinstimmenden Parameternamen gesucht. Angenommen, ein Typ, der von der TypeName -Eigenschaft angegeben wird, verfügt über zwei Methoden mit dem Namen UpdateARecord
. Einer UpdateARecord
verfügt über einen Parameter, ID
und der andere UpdateARecord
verfügt über zwei Parameter und Number
Name
. Wenn die UpdateParameters Auflistung nur über einen Parameter namens verfügt ID
, wird die UpdateARecord
-Methode mit nur dem ID
-Parameter aufgerufen. Der Typ des Parameters wird beim Auflösen der Methoden nicht überprüft. Die Reihenfolge der Parameter spielt keine Rolle.
Wenn die DataObjectTypeName -Eigenschaft festgelegt ist, wird die -Methode auf eine andere Weise aufgelöst. Sucht ObjectDataSource nach einer Methode mit dem Namen, der in der UpdateMethod -Eigenschaft angegeben ist, die einen Parameter des typs akzeptiert, der in der DataObjectTypeName -Eigenschaft angegeben ist. In diesem Fall spielt der Name des Parameters keine Rolle.