Sdílet prostřednictvím


ObjectDataSource.UpdateMethod Vlastnost

Definice

Získá nebo nastaví název metody nebo funkce, kterou ObjectDataSource ovládací prvek vyvolá k aktualizaci dat.

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

Hodnota vlastnosti

Řetězec, který představuje název metody nebo funkce, kterou ObjectDataSource používá k aktualizaci dat. Výchozí hodnota je prázdný řetězec.

Příklady

Následující tři příklady ukazují webovou stránku, třídu stránky s kódem a třídu pro přístup k datům, která uživateli umožňují načíst a aktualizovat záznamy v tabulce Employees v databázi Northwind.

První příklad ukazuje webovou stránku, která obsahuje dva ObjectDataSource ovládací prvky, DropDownList ovládací prvek a DetailsView ovládací prvek. První ObjectDataSource ovládací prvek a DropDownList ovládací prvek slouží k načtení a zobrazení jmen zaměstnanců z databáze. ObjectDataSource Druhý ovládací prvek a DetailsView ovládací prvek slouží k načtení, zobrazení a úpravě dat ze záznamu zaměstnance vybraného uživatelem.

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

Druhý příklad ukazuje obslužné rutiny pro události Selected a Updating události. Obslužná Selected rutina události serializuje objekt, který obsahuje data načtená z tabulky Employee. Serializovaný objekt je uložen ve stavu zobrazení. Obslužná rutina Updating události deserializuje objekt ve stavu zobrazení, který obsahuje původní data pro datový záznam, který se aktualizuje. Objekt, který obsahuje původní data, se předává jako parametr metodě Update. Původní data musí být předána do databáze, aby bylo možné je použít ke kontrole, zda byla data upravena jiným procesem.

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

Třetí příklad ukazuje třídu přístupu k datům, která komunikuje s databází Northwind. Třída používá LINQ k dotazování a aktualizaci tabulky Employees. Příklad vyžaduje třídu LINQ to SQL, která představuje databázi Northwind a tabulku Employees. Další informace naleznete v tématu Postupy: Vytvoření tříd LINQ to SQL ve webovém projektu.

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

Poznámky

Ovládací ObjectDataSource prvek předpokládá, že metoda identifikovaná UpdateMethod vlastností provádí aktualizace po jednom, nikoli v dávce.

Vlastnost UpdateMethod deleguje na UpdateMethod vlastnost objektu ObjectDataSourceView , který je přidružen k ObjectDataSource ovládacího prvku.

Ujistěte se, že názvy parametrů nakonfigurované pro ObjectDataSource ovládací prvek v UpdateParameters kolekci odpovídají názvům sloupců vrácených metodou select.

Životnost objektu

Metoda, která je identifikována UpdateMethod vlastností může být instance metoda nebo static (Shared v jazyce Visual Basic). Pokud se jedná o metodu instance, obchodní objekt je vytvořen a zničen pokaždé, když je volána metoda, která je určena UpdateMethod vlastností. Můžete zpracovat ObjectCreated události pro ObjectCreating práci s obchodním objektem před metodou, která je určena UpdateMethod vlastností je volána. Můžete také zpracovat ObjectDisposing událost, která je vyvolána po metodě, která je určena UpdateMethod vlastností je volána. Pokud obchodní objekt implementuje IDisposable rozhraní, Dispose je volána metoda před zničením objektu. Pokud je static metoda (Shared v jazyce Visual Basic), obchodní objekt není nikdy vytvořen a nelze zpracovat ObjectCreated, ObjectCreatinga ObjectDisposing události.

Slučování parametrů

Parametry se přidají do UpdateParameters kolekce ze tří zdrojů:

  • Z ovládacího prvku vázaného na data v době běhu.

  • Z elementu UpdateParameters deklarativní.

  • Z obslužné rutiny Updating události programově.

Nejprve se do kolekce přidají všechny parametry vygenerované z ovládacích prvků vázaných na UpdateParameters data. Pokud ObjectDataSource je například ovládací prvek vázán na GridView ovládací prvek, který obsahuje sloupce Name , a Numberparametry pro Name a Number jsou přidány do kolekce. Přesný název parametru OldValuesParameterFormatString závisí na vlastnosti. Datový typ těchto parametrů je string. Dále se přidají parametry uvedené v elementu UpdateParameters . Pokud je v elementu UpdateParameters nalezen parametr se stejným názvem jako parametr, který je již v UpdateParameters kolekci, stávající parametr je upraven tak, aby odpovídal parametru zadanému v elementu UpdateParameters . Obvykle se používá k úpravě typu dat v parametru. Nakonec můžete programově přidat a odebrat parametry v Updating události, ke kterým dochází před spuštěním Update metody. Metoda je vyřešena po sloučení parametrů. Řešení metod je popsáno v další části.

Důležité

Měli byste ověřit libovolnou hodnotu parametru, kterou obdržíte od klienta. Modul runtime jednoduše nahradí hodnotu parametru vlastností UpdateMethod .

Řešení metody

Při zavolání Update metody jsou datová pole z ovládacího prvku vázaného na data, parametry, které byly vytvořeny deklarativní v elementu UpdateParameters , a parametry přidané do Updating obslužné rutiny události jsou sloučeny. (Další informace najdete v předchozí části.) Ovládací ObjectDataSource prvek se pak pokusí najít metodu volání. Nejprve vyhledá jednu nebo více metod s názvem zadaným UpdateMethod ve vlastnosti. Pokud se nenajde žádná shoda, vyvolá InvalidOperationException se výjimka. Pokud se najde shoda, vyhledá odpovídající názvy parametrů. Předpokládejme například, že typ, který je určen vlastností TypeName má dvě metody s názvem UpdateARecord. Jeden UpdateARecord má jeden parametr a IDdruhý UpdateARecord má dva parametry a NameNumber. UpdateParameters Pokud kolekce má pouze jeden parametr s názvem ID, UpdateARecord metoda s pouze ID parametr je volána. Typ parametru není vrácen se změnami při překladu metod. Pořadí parametrů nezáleží.

DataObjectTypeName Pokud je vlastnost nastavena, metoda je vyřešena jiným způsobem. Vyhledá ObjectDataSource metodu s názvem zadaným ve UpdateMethod vlastnosti, která přebírá jeden parametr typu, který je zadán v DataObjectTypeName vlastnosti. V tomto případě nezáleží na názvu parametru.

Platí pro

Viz také