ObjectDataSource.UpdateMethod Właściwość

Definicja

Pobiera lub ustawia nazwę metody lub funkcji wywoływanej przez ObjectDataSource 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ę strony za kodem i klasę dostępu do danych, która umożliwia użytkownikowi pobieranie i aktualizowanie rekordów w tabeli Employees w bazie danych Northwind.

Pierwszy przykład przedstawia stronę sieci Web zawierającą dwie ObjectDataSource kontrolki, kontrolkę DropDownList i kontrolkę DetailsView . Pierwsza ObjectDataSource kontrolka i kontrolka DropDownList są używane 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 . Procedura 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 ich 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. W przykładzie jest wymagana klasa LINQ to SQL reprezentująca tabelę Northwind Database i 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, która jest 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 wywoływana jest metoda określona UpdateMethod przez właściwość. Zdarzenia i można obsługiwać ObjectCreated do pracy z obiektem biznesowym przed wywołaną metodą, która jest określona UpdateMethod przez właściwość .ObjectCreating Można również obsłużyć ObjectDisposing zdarzenie wywoływane po wywołaniu UpdateMethod metody określonej przez 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ć zdarzeń ObjectCreated, 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 Number, parametry elementu Name i Number zostaną dodane 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 elemecie UpdateParameters . Jeśli parametr w elemecie UpdateParameters zostanie znaleziony o tej samej nazwie co parametr, który znajduje się już w UpdateParameters kolekcji, istniejący parametr zostanie zmodyfikowany w celu dopasowania do parametru określonego w elemecie UpdateParameters . Zazwyczaj jest to używane do modyfikowania typu danych w parametrze . Na koniec można programowo dodawać i usuwać 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 podstawi wartość parametru do UpdateMethod właściwości .

Rozpoznawanie metody

Po wywołaniu Update metody pola danych z kontrolki powiązanej z danymi, parametry, które zostały utworzone deklaratywnie w elemecie UpdateParameters , a 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 jedną lub więcej metod o nazwie określonej we UpdateMethod właściwości . Jeśli dopasowanie nie zostanie znalezione, 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 , IDa drugi UpdateARecord ma dwa parametry: Name i Number. UpdateParameters Jeśli kolekcja ma tylko jeden parametr o nazwie ID, wywoływana UpdateARecord jest metoda z tylko parametrem ID . 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.

Dotyczy

Zobacz też