ObjectDataSource.UpdateMethod Egenskap

Definition

Hämtar eller anger namnet på den metod eller funktion som ObjectDataSource kontrollen anropar för att uppdatera data.

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

Egenskapsvärde

En sträng som representerar namnet på den metod eller funktion som ObjectDataSource används för att uppdatera data. Standardvärdet är en tom sträng.

Exempel

Följande tre exempel visar en webbsida, en kod bakom sidklass och en dataåtkomstklass som gör det möjligt för en användare att hämta och uppdatera poster i tabellen Anställda i Northwind-databasen.

Det första exemplet visar en webbsida som innehåller två ObjectDataSource kontroller, en DropDownList kontroll och en DetailsView kontroll. Den första ObjectDataSource kontrollen och DropDownList kontrollen används för att hämta och visa medarbetarnamn från databasen. Den andra ObjectDataSource kontrollen och DetailsView kontrollen används för att hämta, visa och ändra data från den medarbetarpost som användaren har valt.

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

Det andra exemplet visar hanterare för Selected händelserna och Updating . Händelsehanteraren Selected serialiserar objektet som innehåller data som hämtades från tabellen Anställd. Det serialiserade objektet lagras i visningstillstånd. Händelsehanteraren Updating deserialiserar objektet i visningstillstånd som innehåller ursprungliga data för den datapost som uppdateras. Objektet som innehåller de ursprungliga data skickas som en parameter till metoden Update. De ursprungliga data måste skickas till databasen så att de kan användas för att kontrollera om data har ändrats av en annan process.

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

Det tredje exemplet visar dataåtkomstklassen som interagerar med Northwind-databasen. Klassen använder LINQ för att fråga efter och uppdatera tabellen Anställda. Exemplet kräver en LINQ till SQL-klass som representerar tabellen Northwind-databas och Anställda. Mer information finns i How to: Create LINQ to SQL Classes in a 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

Kommentarer

Kontrollen ObjectDataSource förutsätter att metoden som identifieras av UpdateMethod egenskapen utför uppdateringar en i taget i stället för i en batch.

Egenskapen UpdateMethod delegerar till UpdateMethod egenskapen för objektet ObjectDataSourceView som är associerat med ObjectDataSource kontrollen.

Kontrollera att parameternamnen som konfigurerats för ObjectDataSource kontrollen i UpdateParameters samlingen matchar kolumnnamnen som returneras av metoden select.

Objektets livslängd

Den metod som identifieras av egenskapen UpdateMethod kan vara en instansmetod eller en static -metod (Shared i Visual Basic). Om det är en instansmetod skapas och förstörs affärsobjektet varje gång metoden som anges av UpdateMethod egenskapen anropas. Du kan hantera ObjectCreated händelserna och ObjectCreating för att arbeta med affärsobjektet innan den metod som anges av UpdateMethod egenskapen anropas. Du kan också hantera händelsen ObjectDisposing som utlöses efter att den metod som anges av UpdateMethod egenskapen anropas. Om affärsobjektet implementerar gränssnittet IDisposable anropas Dispose metoden innan objektet förstörs. Om metoden är static (Shared i Visual Basic) skapas aldrig affärsobjektet och du kan inte hantera händelserna ObjectCreated, ObjectCreating och ObjectDisposing.

Sammanslagning av parameter

Parametrar läggs till i UpdateParameters samlingen från tre källor:

  • Från den databundna kontrollen vid körning.

  • Från elementet UpdateParameters deklarativt.

  • Updating Från händelsehanteraren programmatiskt.

Först läggs alla parametrar som genereras från databundna kontroller till i UpdateParameters samlingen. Om kontrollen till exempel ObjectDataSource är bunden till en GridView kontroll som har kolumnerna Name och Number, läggs parametrarna för Name och Number till i samlingen. Det exakta namnet på parametern beror på egenskapen OldValuesParameterFormatString . Datatypen för dessa parametrar är string. Därefter läggs de parametrar som visas i elementet UpdateParameters till. Om en parameter i elementet UpdateParameters hittas med samma namn som en parameter som redan finns i UpdateParameters samlingen ändras den befintliga parametern så att den matchar parametern som anges i elementet UpdateParameters . Detta används vanligtvis för att ändra typen av data i parametern. Slutligen kan du programmatiskt lägga till och ta bort parametrar i Updating händelsen, som inträffar innan Update metoden körs. Metoden löses när parametrarna har sammanfogats. Metodmatchning beskrivs i nästa avsnitt.

Important

Du bör verifiera alla parametervärden som du får från klienten. Körningen ersätter helt enkelt parametervärdet i egenskapen UpdateMethod .

Metodmatchning

Update När metoden anropas sammanfogas alla datafält från den databundna kontrollen, parametrarna som skapades deklarativt i elementet UpdateParameters och de parametrar som lades till i Updating händelsehanteraren. (Mer information finns i föregående avsnitt.) Kontrollen ObjectDataSource försöker sedan hitta en anropsmetod. Först letar den efter en eller flera metoder med det namn som anges i egenskapen UpdateMethod . Om ingen matchning hittas utlöses ett InvalidOperationException undantag. Om en matchning hittas letar den efter matchande parameternamn. Anta till exempel att en typ som anges av TypeName egenskapen har två metoder med namnet UpdateARecord. Den ena UpdateARecord har en parameter, ID, och den andra UpdateARecord har två parametrar och NameNumber. Om samlingen UpdateParameters bara har en parameter med namnet IDUpdateARecord anropas metoden med bara parametern ID . Parametertypen är inte markerad för att matcha metoderna. Parametrarnas ordning spelar ingen roll.

Om egenskapen DataObjectTypeName har angetts löses metoden på ett annat sätt. Söker ObjectDataSource efter en metod med det namn som anges i egenskapen UpdateMethod som tar en parameter av den typ som anges i DataObjectTypeName egenskapen. I det här fallet spelar namnet på parametern ingen roll.

Gäller för

Se även