Udostępnij za pośrednictwem


ObjectDataSource.UpdateMethod Właściwość

Definicja

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

W pierwszym przykładzie przedstawiono stronę sieci Web zawierającą dwie ObjectDataSource kontrolki, kontrolkę DropDownList i kontrolkę DetailsView . Pierwsza ObjectDataSource kontrolka i kontrolka DropDownList służą 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 Program 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 go 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. Przykład wymaga klasy LINQ to SQL reprezentującej bazę danych Northwind i tabelę 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 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 metoda określona przez UpdateMethod właściwość jest wywoływana. Zdarzenia i można obsługiwaćObjectCreated, aby pracować z obiektem biznesowym, zanim zostanie wywołana metoda określona UpdateMethod przez właściwość.ObjectCreating Można również obsłużyć ObjectDisposing zdarzenie, które jest wywoływane po wywołaniu metody określonej przez UpdateMethod 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ć ObjectCreatedzdarzeń , 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 , parametry i NumberNameNumber są dodawane 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 UpdateParameters elemecie . Jeśli parametr w UpdateParameters elemecie zostanie znaleziony o takiej samej nazwie jak parametr, który znajduje się już w UpdateParameters kolekcji, istniejący parametr zostanie zmodyfikowany tak, aby był zgodny z parametrem określonym w UpdateParameters elemecie . Zazwyczaj jest to używane do modyfikowania typu danych w parametrze . Na koniec można programowo dodać i usunąć 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 zastępuje wartość parametru UpdateMethod do właściwości .

Rozwiązanie metody

Po wywołaniu Update metody pola danych z kontrolki powiązanej z danymi, parametry utworzone deklaratywnie w UpdateParameters elemecie i 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 co najmniej jedną metodę o nazwie określonej we UpdateMethod właściwości. Jeśli nie zostanie znalezione dopasowanie, 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, UpdateARecord metoda z tylko parametrem jest wywoływanaID. 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ż