asa*_*yer 1 c# asp.net objectdatasource scriptmanager visual-studio-2008
创建一个新的Web应用程序(我使用的是Visual Studio 2008版本9.0.30729.1 SP)
在Aspx页面中,将Form标签替换为:(可能需要更改类型名称以匹配您的页面名称)
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True" />
<div>
<asp:DropDownList runat="server" DataSourceID="ObjectDataSource1">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Data" TypeName="WebApplication1.WebForm2"
OnObjectCreating="ObjectDataSource1_ObjectCreating"></asp:ObjectDataSource>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
在服务器页面上,添加以下功能:
public IEnumerable<string> Data()
{
return new string[] { "some data", "foo", "bar" };
}
Run Code Online (Sandbox Code Playgroud)
然后添加此事件处理程序:
protected void ObjectDataSource1_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
e.ObjectInstance = this;
}
Run Code Online (Sandbox Code Playgroud)
现在运行应用程序.我得到"Sys is undefined"脚本错误.自动脚本的大部分完全丢失.
现在注释掉对象实例行,
protected void ObjectDataSource1_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
//e.ObjectInstance = this;
}
Run Code Online (Sandbox Code Playgroud)
现在,当您运行应用程序时,没有脚本错误.
这里发生了什么?
我怀疑这里发生的是ObjectDataSource在页面完成之前被释放.
始终在业务对象的实例(业务对象是此上下文中的页面)被丢弃之前引发ObjectDisposing事件.如果业务对象实现了IDisposable接口,则在引发此事件后调用Dispose方法(页面实现IDisposable,例如Control> TemplateControl> Page
您需要通过onobjectdisposing事件取消处理对象,例如.
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Data" TypeName="WebApplication1.WebForm2"
OnObjectCreating="ObjectDataSource1_ObjectCreating"
onobjectdisposing="ObjectDataSource1_ObjectDisposing"></asp:ObjectDataSource>
Run Code Online (Sandbox Code Playgroud)
处理程序:
protected void ObjectDataSource1_ObjectDisposing(object sender, ObjectDataSourceDisposingEventArgs e)
{
e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)
有趣的设计虽然?一般来说,我更喜欢将objectdatasource方法放在一个单独的类中.