ObjectDataSource.UpdateMethod 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取或设置由 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 用于更新数据的方法或函数的名称的字符串。 默认值为一个空字符串。
示例
以下三个示例演示了一个网页、一个代码隐藏页类和数据访问类,这些类使用户能够检索和更新 Northwind 数据库的 Employees 表中的记录。
第一个示例演示一个网页,其中包含两 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>
第二个示例显示了 和 Updating 事件的处理程序Selected。 事件处理程序 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 表。 有关详细信息,请参阅 如何:在 Web 项目中创建 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与 ObjectDataSource 控件关联的 对象的 属性ObjectDataSourceView。
确保为集合中的 UpdateParameters 控件配置ObjectDataSource的参数名称与 select 方法返回的列名称匹配。
对象生存期
属性 UpdateMethod 标识的方法可以是实例方法,也可以是 static
Visual Basic) Shared
方法中的 (。 如果它是实例方法,则每次调用 属性指定的 UpdateMethod 方法时,都会创建并销毁业务对象。 在调用 属性指定UpdateMethod的方法之前,可以处理 ObjectCreated 和 ObjectCreating 事件以使用业务对象。 还可以处理在 ObjectDisposing 调用 属性指定的 UpdateMethod 方法后引发的事件。 如果业务对象实现 IDisposable 接口,则会在 Dispose 销毁对象之前调用 方法。 如果在 Visual Basic) Shared
中 (方法static
,则永远不会创建业务对象,并且无法处理 ObjectCreated、 ObjectCreating和 ObjectDisposing 事件。
参数合并
参数从三个 UpdateParameters 源添加到集合:
在运行时通过数据绑定控件。
UpdateParameters
以声明方式从 元素。Updating通过事件处理程序,以编程方式。
首先,从数据绑定控件生成的任何参数都会添加到集合中 UpdateParameters 。 例如,如果控件ObjectDataSource绑定到GridView具有 列Name
和 Number
的控件,则 和 Number
的参数Name
将添加到集合中。 参数的确切名称取决于 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 类型的一个参数。 在这种情况下,参数的名称并不重要。