ObjectDataSource.ObjectDisposing 事件
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在丢弃由 TypeName 属性标识的对象之前发生。
public:
event System::Web::UI::WebControls::ObjectDataSourceDisposingEventHandler ^ ObjectDisposing;
public event System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler ObjectDisposing;
member this.ObjectDisposing : System.Web.UI.WebControls.ObjectDataSourceDisposingEventHandler
Public Custom Event ObjectDisposing As ObjectDataSourceDisposingEventHandler
事件类型
示例
本部分包含两个代码示例。 第一个 ObjectDataSource 代码示例演示如何将 对象与业务对象和 GridView 控件结合使用来显示信息。 第二个代码示例提供在第一个代码示例中使用的中间层业务对象。
下面的代码示例演示如何将 ObjectDataSource 控件与业务对象和 GridView 控件一起使用来显示信息。 你可能使用一个业务对象,该业务对象在创建 (方面非常昂贵,) 网页执行的每个数据操作) 。 使用成本高昂的对象的方法之一可能是创建一次实例,然后缓存该实例以用于后续操作,而不是针对每个数据操作创建和销毁它。 此示例演示了此模式。 可以处理 ObjectCreating 事件以先检查对象的缓存,并且仅创建它的实例(如果尚未缓存)。 然后,处理 ObjectDisposing 事件以缓存业务对象以供将来使用,而不是销毁它。 在此代码示例中 CancelEventArgs.Cancel , 对象的 属性 ObjectDataSourceDisposingEventArgs 设置为 , true
以指示 ObjectDataSource 不对 对象调用 Dispose 方法。
<%@ Import namespace="Samples.AspNet.CS" %>
<%@ Page language="c#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// Instead of creating and destroying the business object each time, the
// business object is cached in the ASP.NET Cache.
private void GetEmployeeLogic(object sender, ObjectDataSourceEventArgs e)
{
// First check to see if an instance of this object already exists in the Cache.
EmployeeLogic cachedLogic;
cachedLogic = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic;
if (null == cachedLogic) {
cachedLogic = new EmployeeLogic();
}
e.ObjectInstance = cachedLogic;
}
private void ReturnEmployeeLogic(object sender, ObjectDataSourceDisposingEventArgs e)
{
// Get the instance of the business object that the ObjectDataSource is working with.
EmployeeLogic cachedLogic = e.ObjectInstance as EmployeeLogic;
// Test to determine whether the object already exists in the cache.
EmployeeLogic temp = Cache["ExpensiveEmployeeLogicObject"] as EmployeeLogic;
if (null == temp) {
// If it does not yet exist in the Cache, add it.
Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic);
}
// Cancel the event, so that the object will
// not be Disposed if it implements IDisposable.
e.Cancel = true;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - C# Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:gridview
id="GridView1"
runat="server"
datasourceid="ObjectDataSource1">
</asp:gridview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetCreateTime"
typename="Samples.AspNet.CS.EmployeeLogic"
onobjectcreating="GetEmployeeLogic"
onobjectdisposing="ReturnEmployeeLogic" >
</asp:objectdatasource>
</form>
</body>
</html>
<%@ Import namespace="Samples.AspNet.VB" %>
<%@ Page language="vb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
' Instead of creating and destroying the business object each time, the
' business object is cached in the ASP.NET Cache.
Sub GetEmployeeLogic(sender As Object, e As ObjectDataSourceEventArgs)
' First check to see if an instance of this object already exists in the Cache.
Dim cachedLogic As EmployeeLogic
cachedLogic = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic)
If (cachedLogic Is Nothing) Then
cachedLogic = New EmployeeLogic
End If
e.ObjectInstance = cachedLogic
End Sub ' GetEmployeeLogic
Sub ReturnEmployeeLogic(sender As Object, e As ObjectDataSourceDisposingEventArgs)
' Get the instance of the business object that the ObjectDataSource is working with.
Dim cachedLogic As EmployeeLogic
cachedLogic = CType( e.ObjectInstance, EmployeeLogic)
' Test to determine whether the object already exists in the cache.
Dim temp As EmployeeLogic
temp = CType( Cache("ExpensiveEmployeeLogicObject"), EmployeeLogic)
If (temp Is Nothing) Then
' If it does not yet exist in the Cache, add it.
Cache.Insert("ExpensiveEmployeeLogicObject", cachedLogic)
End If
' Cancel the event, so that the object will
' not be Disposed if it implements IDisposable.
e.Cancel = True
End Sub ' ReturnEmployeeLogic
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ObjectDataSource - VB Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:gridview
id="GridView1"
runat="server"
datasourceid="ObjectDataSource1">
</asp:gridview>
<asp:objectdatasource
id="ObjectDataSource1"
runat="server"
selectmethod="GetCreateTime"
typename="Samples.AspNet.VB.EmployeeLogic"
onobjectcreating="GetEmployeeLogic"
onobjectdisposing="ReturnEmployeeLogic" >
</asp:objectdatasource>
</form>
</body>
</html>
下面的代码示例提供了前面的代码示例使用的示例中间层业务对象。 该代码示例由 类定义 EmployeeLogic
的基本业务对象组成,该类是封装业务逻辑的有状态类。 对于完整的工作示例,必须将此代码编译为库,并从 ASP.NET 页 (.aspx 文件) 使用这些类。
namespace Samples.AspNet.CS {
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
//
// EmployeeLogic is a stateless business object that encapsulates
// the operations you can perform on a NorthwindEmployee object.
//
public class EmployeeLogic {
public EmployeeLogic () : this(DateTime.Now) {
}
public EmployeeLogic (DateTime creationTime) {
_creationTime = creationTime;
}
private DateTime _creationTime;
// Returns a collection of NorthwindEmployee objects.
public ICollection GetCreateTime () {
ArrayList al = new ArrayList();
// Returns creation time for this example.
al.Add("The business object that you are using was created at " + _creationTime);
return al;
}
}
}
Imports System.Collections
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace Samples.AspNet.VB
Public Class EmployeeLogic
Public Sub New()
MyClass.New(DateTime.Now)
End Sub
Public Sub New(ByVal creationTime As DateTime)
_creationTime = creationTime
End Sub
Private _creationTime As DateTime
' Returns a collection of NorthwindEmployee objects.
Public Function GetCreateTime() As ICollection
Dim al As New ArrayList()
' Returns creation time for this example.
al.Add("The business object that you are using was created at " + _creationTime)
Return al
End Function 'GetCreateTime
End Class
End Namespace ' Samples.AspNet.VB
以下示例演示如何在 ObjectDisposing 将控件与 LINQ to SQL 类一起使用 ObjectDataSource 时处理 事件。
Public Sub ExampleObjectDisposing(ByVal sender As Object, _
ByVal e As ObjectDataSourceDisposingEventArgs)
e.Cancel = True
End Sub
public void ExampleObjectDisposing(object sender,
ObjectDataSourceDisposingEventArgs e)
{
e.Cancel = true;
}
注解
始终 ObjectDisposing 在放弃业务对象的实例之前引发 事件。 如果业务对象实现 IDisposable 接口,则会在 Dispose 引发此事件后调用 方法。
ObjectDisposing处理 事件以调用对象上的其他方法、设置属性或在销毁对象之前执行特定于对象的清理。 对 对象的引用由 ObjectInstance 属性访问,该属性由 ObjectDataSourceEventArgs 对象公开。
将 ObjectDataSource 控件与 LINQ to SQL 类一起使用时,必须取消在事件的处理程序 ObjectDisposing 中释放数据上下文类。 此步骤是必需的,因为 LINQ to SQL 支持延迟执行,而 ObjectDataSource 控件尝试在 Select 操作后释放数据上下文。
有关如何处理事件的详细信息,请参阅 处理和引发事件。