Share via


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 na pozadí a třídu přístupu k datům, které uživateli umožňují načítat 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. Druhý ObjectDataSource 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 Selected pro události a Updating . Obslužná rutina Selected 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á jako parametr metodě Update. Původní data musí být předána do databáze, aby je bylo možné použít ke kontrole, zda byla data změněna 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 najdete 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 vlastnost UpdateMethod objektu ObjectDataSourceView , který je přidružen k ovládacímu ObjectDataSource prvku.

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

Doba života objektu

Metoda identifikovaná UpdateMethod vlastností může být metoda instance nebo static metoda (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 a ObjectCreating pro práci s obchodním objektem před zavoláním metody, která je určena UpdateMethod vlastností. Můžete také zpracovat ObjectDisposing událost, která je vyvolána po zavolání metody, která je určena UpdateMethod vlastností. 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 se nikdy nevytvořil a nelze zpracovat ObjectCreatedudálosti , ObjectCreatinga ObjectDisposing .

Slučování parametrů

Parametry se do UpdateParameters kolekce přidávají ze tří zdrojů:

  • Z ovládacího prvku vázaného na data za 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ázaný GridView na ovládací prvek, který obsahuje sloupce Name a Number, parametry pro Name a Number se přidají do kolekce. Přesný název parametru závisí na OldValuesParameterFormatString vlastnosti. Datový typ těchto parametrů je string. Dále jsou přidány parametry, které jsou uvedeny v elementu UpdateParameters . Pokud je nalezen parametr v elementu UpdateParameters se stejným názvem jako parametr, který je již v UpdateParameters kolekci, existující parametr je upraven tak, aby odpovídal parametru, který je zadán v elementu UpdateParameters . Obvykle se to používá ke změně typu dat v parametru. Nakonec můžete programově přidat a odebrat parametry v Updating události, která nastane před spuštěním Update metody. Metoda je vyřešena po sloučení parametrů. Řešení metody je popsáno v další části.

Důležité

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

Řešení metody

Při zavolání Update metody se sloučí všechna datová pole z ovládacího prvku vázaného na data, parametry vytvořené deklarativně v elementu UpdateParameters a parametry přidané v Updating obslužné rutině události. (Další informace najdete v předchozí části.) Ovládací ObjectDataSource prvek se pak pokusí najít metodu, která se má volat. Nejprve vyhledá jednu nebo více metod s názvem, který je zadán ve UpdateMethod vlastnosti. Pokud se nenajde žádná shoda, vyvolá se InvalidOperationException výjimka. Pokud se najde shoda, vyhledá odpovídající názvy parametrů. Předpokládejme například, že typ určený TypeName vlastností má dvě metody s názvem UpdateARecord. Jeden UpdateARecord má jeden parametr ID, a druhý UpdateARecord má dva parametry Name a Number. UpdateParameters Pokud má kolekce pouze jeden parametr s názvem ID, UpdateARecord volá se metoda pouze s parametrem ID . Typ parametru se při překladu metod nekontroluje. 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, který je zadán ve UpdateMethod vlastnosti, která přebírá jeden parametr typu, který je zadán ve DataObjectTypeName vlastnosti. V tomto případě nezáleží na názvu parametru.

Platí pro

Viz také