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


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 свойством . События и ObjectCreating можно обрабатывать ObjectCreated для работы с бизнес-объектом до вызова метода, указанного свойством UpdateMethod . Можно также обработать ObjectDisposing событие, которое возникает после вызова метода, указанного свойством UpdateMethod . Если бизнес-объект реализует IDisposable интерфейс, Dispose метод вызывается перед уничтожением объекта. Если метод имеет значение static (Shared в Visual Basic), бизнес-объект никогда не создается и вы не можете обработать ObjectCreatedсобытия , ObjectCreatingи ObjectDisposing .

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

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

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

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

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

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

Важно!

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

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

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

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

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

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