ObjectDataSource.UpdateMethod Eigenschap

Definitie

Hiermee haalt u de naam op van de methode of functie die door het ObjectDataSource besturingselement wordt aangeroepen om gegevens bij te werken.

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

Waarde van eigenschap

Een tekenreeks die de naam vertegenwoordigt van de methode of functie die wordt ObjectDataSource gebruikt om gegevens bij te werken. De standaardwaarde is een lege tekenreeks.

Voorbeelden

In de volgende drie voorbeelden ziet u een webpagina, een code-behind-paginaklasse en een gegevenstoegangsklasse waarmee een gebruiker records kan ophalen en bijwerken in de tabel Werknemers in de Northwind-database.

In het eerste voorbeeld ziet u een webpagina met twee ObjectDataSource besturingselementen, een DropDownList besturingselement en een DetailsView besturingselement. Het eerste ObjectDataSource besturingselement en het DropDownList besturingselement worden gebruikt om namen van werknemers op te halen en weer te geven uit de database. Het tweede ObjectDataSource besturingselement en het DetailsView besturingselement worden gebruikt om de gegevens op te halen, weer te geven en te wijzigen uit de werknemersrecord die door de gebruiker is geselecteerd.

<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>

In het tweede voorbeeld ziet u handlers voor de Selected en Updating gebeurtenissen. De Selected gebeurtenis-handler serialiseert het object dat gegevens bevat die zijn opgehaald uit de tabel Werknemer. Het geserialiseerde object wordt opgeslagen in de weergavestatus. De Updating gebeurtenishandler ontserialiseerd het object in de weergavestatus die de oorspronkelijke gegevens bevat voor de gegevensrecord die wordt bijgewerkt. Het object dat de oorspronkelijke gegevens bevat, wordt doorgegeven als een parameter aan de updatemethode. De oorspronkelijke gegevens moeten worden doorgegeven aan de database, zodat deze kunnen worden gebruikt om te controleren of de gegevens zijn gewijzigd door een ander 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

In het derde voorbeeld ziet u de gegevenstoegangsklasse die communiceert met de Northwind-database. De klasse maakt gebruik van LINQ om de tabel Werknemers op te vragen en bij te werken. Voor het voorbeeld is een LINQ vereist naar SQL-klasse die de northwind-database en de tabel Werknemers vertegenwoordigt. Zie Hoe to: LINQ maken voor SQL-klassen in een web-Project voor meer informatie.

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

Opmerkingen

In ObjectDataSource het besturingselement wordt ervan uitgegaan dat de methode die door de UpdateMethod eigenschap wordt geïdentificeerd, updates één voor één uitvoert in plaats van in een batch.

De UpdateMethod eigenschap wordt gedelegeerd aan de UpdateMethod eigenschap van het ObjectDataSourceView object dat is gekoppeld aan het ObjectDataSource besturingselement.

Zorg ervoor dat de parameternamen die zijn geconfigureerd voor het ObjectDataSource besturingselement in de UpdateParameters verzameling overeenkomen met de kolomnamen die worden geretourneerd door de selectiemethode.

Levensduur van object

De methode die wordt geïdentificeerd door de eigenschap UpdateMethod kan een instantiemethode of een methode static (Shared in Visual Basic) zijn. Als het een instantiemethode is, wordt het bedrijfsobject gemaakt en vernietigd telkens wanneer de methode die is opgegeven door de UpdateMethod eigenschap wordt aangeroepen. U kunt de ObjectCreated en ObjectCreating gebeurtenissen afhandelen om met het bedrijfsobject te werken voordat de methode die is opgegeven door de UpdateMethod eigenschap wordt aangeroepen. U kunt ook de ObjectDisposing gebeurtenis afhandelen die wordt gegenereerd nadat de methode die is opgegeven door de UpdateMethod eigenschap wordt aangeroepen. Als het bedrijfsobject de IDisposable interface implementeert, wordt de Dispose methode aangeroepen voordat het object wordt vernietigd. Als de methode is static (Shared in Visual Basic), wordt het bedrijfsobject nooit gemaakt en kunt u de gebeurtenissen ObjectCreated, ObjectCreating en ObjectDisposing niet verwerken.

Parameter samenvoegen

Parameters worden vanuit drie bronnen toegevoegd aan de UpdateParameters verzameling:

  • Vanuit het gegevensgebonden besturingselement, tijdens runtime.

  • Van het UpdateParameters element, declaratief.

  • Programmatisch vanuit de Updating gebeurtenis-handler.

Eerst worden parameters die worden gegenereerd op basis van gegevensgebonden besturingselementen toegevoegd aan de UpdateParameters verzameling. Als het ObjectDataSource besturingselement bijvoorbeeld is gebonden aan een GridView besturingselement met de kolommen Name en Number, worden de parameters voor Name en Number toegevoegd aan de verzameling. De exacte naam van de parameter is afhankelijk van de OldValuesParameterFormatString eigenschap. Het gegevenstype van deze parameters is string. Vervolgens worden de parameters die in het UpdateParameters element worden vermeld, toegevoegd. Als een parameter in het UpdateParameters element wordt gevonden met dezelfde naam als een parameter die zich al in de UpdateParameters verzameling bevindt, wordt de bestaande parameter gewijzigd zodat deze overeenkomt met de parameter die is opgegeven in het UpdateParameters element. Dit wordt meestal gebruikt om het type gegevens in de parameter te wijzigen. Ten slotte kunt u programmatisch parameters toevoegen en verwijderen in de Updating gebeurtenis, die plaatsvinden voordat de Update methode wordt uitgevoerd. De methode wordt opgelost nadat de parameters zijn samengevoegd. Methodeomzetting wordt in de volgende sectie besproken.

Important

U moet een parameterwaarde valideren die u van de client ontvangt. De runtime vervangt simpelweg de parameterwaarde in de UpdateMethod eigenschap.

Methodeomzetting

Wanneer de Update methode wordt aangeroepen, worden de gegevensvelden van het besturingselement voor gegevens, de parameters die declaratief in het UpdateParameters element zijn gemaakt en de parameters die in de Updating gebeurtenis-handler zijn toegevoegd, allemaal samengevoegd. (Zie de voorgaande sectie voor meer informatie.) Het ObjectDataSource besturingselement probeert vervolgens een methode te vinden die moet worden aangeroepen. Eerst wordt gezocht naar een of meer methoden met de naam die is opgegeven in de UpdateMethod eigenschap. Als er geen overeenkomst wordt gevonden, wordt er een InvalidOperationException uitzondering gegenereerd. Als er een overeenkomst wordt gevonden, zoekt deze naar overeenkomende parameternamen. Stel dat een type dat door de eigenschap is opgegeven, twee methoden heeft met de TypeName naam UpdateARecord. De UpdateARecord ene heeft één parameter, IDen de andere UpdateARecord heeft twee parameters, Name en Number. Als de UpdateParameters verzameling slechts één parameter heeft met de naam ID, wordt de UpdateARecord methode met alleen de ID parameter aangeroepen. Het type van de parameter wordt niet gecontroleerd bij het omzetten van de methoden. De volgorde van de parameters maakt niet uit.

Als de DataObjectTypeName eigenschap is ingesteld, wordt de methode op een andere manier omgezet. Er ObjectDataSource wordt gezocht naar een methode met de naam die is opgegeven in de UpdateMethod eigenschap die één parameter gebruikt van het type dat is opgegeven in de DataObjectTypeName eigenschap. In dit geval maakt de naam van de parameter niet uit.

Van toepassing op

Zie ook