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 . В этом случае имя параметра не имеет значения.