Поделиться через


ObjectDataSource.UpdateMethod Свойство

Определение

Возвращает или задает имя метода или функции, вызываемой ObjectDataSource элементом управления для обновления данных.

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

Значение свойства

Строка, представляющая имя метода или функции, которая ObjectDataSource используется для обновления данных. Значением по умолчанию является пустая строка.

Примеры

В следующих трех примерах показаны веб-страница, класс страницы программной части и класс доступа к данным, позволяющий пользователю получать и обновлять записи в таблице Employees в базе данных Northwind.

В первом примере показана веб-страница, содержащая два ObjectDataSource элемента управления, DropDownList элемент управления и DetailsView элемент управления. Первый ObjectDataSource элемент управления и DropDownList элемент управления используются для получения и отображения имен сотрудников из базы данных. Второй ObjectDataSource элемент управления и DetailsView элемент управления используются для извлечения, отображения и изменения данных из записи сотрудника, выбранной пользователем.

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

Во втором примере показаны обработчики для Selected событий и Updating событий. Обработчик Selected событий сериализует объект, содержащий данные, полученные из таблицы Employee. Сериализованный объект хранится в состоянии представления. Обработчик Updating событий десериализирует объект в состоянии представления, который содержит исходные данные для обновляемой записи данных. Объект, содержащий исходные данные, передается в качестве параметра методу Update. Исходные данные должны передаваться в базу данных, чтобы ее можно было использовать для проверки того, были ли изменены данные другим процессом.

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

В третьем примере показан класс доступа к данным, взаимодействующий с базой данных Northwind. Класс использует LINQ для запроса и обновления таблицы Employees. В примере требуется класс LINQ to SQL, представляющий базу данных Northwind и таблицу Employees. Дополнительные сведения см. в статье "Создание классов LINQ to SQL" в веб-проекте.

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

Комментарии

Элемент ObjectDataSource управления предполагает, что метод, определяемый свойством UpdateMethod , выполняет обновления по одному за раз, а не в пакете.

Свойство UpdateMethod делегирует UpdateMethod свойству объекта, связанного ObjectDataSourceView с элементом ObjectDataSource управления.

Убедитесь, что имена параметров, настроенные для ObjectDataSource элемента управления в UpdateParameters коллекции, соответствуют именам столбцов, возвращаемым методом select.

Время существования объекта

Метод, который определяется свойством UpdateMethod , может быть методом экземпляра или static методом (Shared в Visual Basic). Если это метод экземпляра, бизнес-объект создается и уничтожается каждый раз при вызове метода, указанного свойством UpdateMethod . Перед вызовом метода, указанного UpdateMethod свойством, можно обрабатывать ObjectCreated и ObjectCreating события для работы с бизнес-объектом. Вы также можете обрабатывать ObjectDisposing событие, которое вызывается после вызова метода, указанного UpdateMethod свойством. Если бизнес-объект реализует IDisposable интерфейс, Dispose метод вызывается перед уничтожением объекта. Если метод имеет значение static (Sharedв Visual Basic), бизнес-объект никогда не создается и не может обрабатывать ObjectCreatedObjectCreatingсобытия и ObjectDisposing события.

Слияние параметров

Параметры добавляются в коллекцию UpdateParameters из трех источников:

  • Из элемента управления, привязанного к данным, во время выполнения.

  • UpdateParameters Из элемента декларативно.

  • Из обработчика событий программным способом Updating .

Во-первых, все параметры, созданные из элементов управления с привязкой к данным, добавляются в коллекцию UpdateParameters . Например, если ObjectDataSource элемент управления привязан к GridView элементу управления с столбцами Name и Numberпараметрами Name для коллекции Number . Точное имя параметра зависит от OldValuesParameterFormatString свойства. Тип данных этих параметров .string Затем добавляются параметры, перечисленные в элементе UpdateParameters . Если параметр в элементе найден с тем же именем, что и параметр, который уже находится в UpdateParametersUpdateParameters коллекции, существующий параметр изменяется в соответствии с параметром, указанным в элементе UpdateParameters . Как правило, это используется для изменения типа данных в параметре. Наконец, можно программным способом добавлять и удалять параметры в Updating событии, которое возникает перед запуском Update метода. Метод разрешается после объединения параметров. Разрешение методов рассматривается в следующем разделе.

Это важно

Необходимо проверить любое значение параметра, полученное от клиента. Среда выполнения просто заменяет значение параметра свойством UpdateMethod .

Разрешение метода

Update При вызове метода поля данных из элемента управления с привязкой к данным, параметры, созданные декларативно в элементе, а параметры, добавленные в UpdateParametersUpdating обработчик событий, объединяются. (Дополнительные сведения см. в предыдущем разделе.) Затем ObjectDataSource элемент управления пытается найти метод для вызова. Сначала он ищет один или несколько методов с именем, указанным в свойстве UpdateMethod . Если совпадение не найдено, InvalidOperationException создается исключение. Если совпадение найдено, он ищет соответствующие имена параметров. Например, предположим, что тип, указанный свойствомTypeName, имеет два метода.UpdateARecord Один UpdateARecord имеет один параметр, IDа другой UpdateARecord имеет два параметра и NameNumber. Если в UpdateParameters коллекции есть только один параметр с именем ID, UpdateARecord метод с только параметром ID вызывается. Тип параметра не проверяется при разрешении методов. Порядок параметров не имеет значения.

DataObjectTypeName Если свойство задано, метод разрешается по-другому. Поиск ObjectDataSource метода с именем, указанным в UpdateMethod свойстве, который принимает один параметр типа, указанного в свойстве DataObjectTypeName . В этом случае имя параметра не имеет значения.

Применяется к

См. также раздел