这是一个Asp.net/Ajax错误吗?Javascript错误和对象数据源

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)

现在,当您运行应用程序时,没有脚本错误.

这里发生了什么?

cst*_*ter 6

我怀疑这里发生的是ObjectDataSource在页面完成之前被释放.

始终在业务对象的实例(业务对象是此上下文中的页面)被丢弃之前引发ObjectDisposing事件.如果业务对象实现了IDisposable接口,则在引发此事件后调用Dispose方法(页面实现IDisposable,例如Control> TemplateControl> Page

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.objectdisposing(v=vs.80).aspx

您需要通过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方法放在一个单独的类中.