Freigeben über


ObjectDataSource.UpdateMethod Eigenschaft

Definition

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 Numberenthä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, IDund der andere UpdateARecord verfügt über zwei Parameter und NumberName . 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.

Gilt für:

Weitere Informationen