控制 OnLoad 永远不会发生,但 OnUnload 会发生

Control OnLoad never happens, but OnUnload does

我有一个包含 ascx 子控件的 aspx 页面,我发现 OnLoad 处理程序从未发生在子 ascx 控件上。实际上,子控件或父控件中没有发生任何事件,除了子控件中的 OnUnload 事件。

我的页面名为 CrystalViewer.aspx,继承自 System.Web.UI.Page,并覆盖了 OnLoadComplete 子页面。此页面包含 CrystalReport.ascx 作为子控件。

标记

<div>
  <uc1:CrystalReport id="CrystalReport1" runat="server" />
</div>

我的子控件名为 CrystalReport.ascx,继承自 DotNetNuke.Entities.Modules 命名空间中的 PortalModuleBase。此子控件包含一个多视图,其中第一个视图允许您 select 参数传递给报表,第二个视图包含 CrystalReportViewer.

<asp:View ID="ViwReport" runat="server">
  <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" Width="350px" Height="50px" HasCrystalLogo="False" SeparatePages="True" />
</asp:View>

我有 OnLoadOnUnload 的重载,每个都登录。

当我在本地导航到 http://localhost/portal/Modules/Reports/CrystalViewer.aspx?data=O%2b3zhvKVeiMG1qKIK6HGm0ONmAKh336xgBBOzfSVwqH%3d 时,出现以下错误。

NullReferenceException: Object reference not set to an instance of an object.
  Reports.CrystalReport.OnUnload(EventArgs e) +401
  System.Web.UI.Control.UnloadRecursive(Boolean dispose) +159
  System.Web.UI.Control.UnloadRecursive(Boolean dispose) +322
  System.Web.UI.Control.UnloadRecursive(Boolean dispose) +322
  System.Web.UI.Page.UnloadRecursive(Boolean dispose) +23
  System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +11538542
  System.Web.UI.Page.ProcessRequest() +269
  System.Web.UI.Page.ProcessRequest(HttpContext context) +167
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 625
  System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

这是 OnUnload 覆盖的一个片段,显示了该方法在爆炸之前达到了多远,因为控制器变量是 Nothing

Protected Overloads Overrides Sub OnUnload(ByVal e As EventArgs)
  Using Log.UI.Trace("CrystalReport.OnUnload")
    Log.UI.Send("RemoveHandler controller.ReportDocumentChanged, AddressOf ReportDocumentChanged")
    Log.UI.Send("controller", controller)
    RemoveHandler controller.ReportDocumentChanged, AddressOf ReportDocumentChanged
    '^ blows up here on controller.ReportDocumentChanged because controller is Nothing
    '... that is the last log message I see, so I'm sure that is what the error here is from
  End Using
End Sub

我一直在比较来自客户端的 web.config 和在开发中工作的 web.config,除了连接字符串之外,它们几乎完全相同。我认为可能有一些 Crystal 报告配置被我们搞砸了,所以我们完全重新安装了它,但我们仍然得到同样的错误。 我不确定下一步该去哪里,我有点等着听他们重启服务器后的情况,所以我问这个是想看看是否有人看到过类似的东西,其中 OnLoad 事件不要开火,但 OnUnload 会开火。看起来很奇怪,它会尝试加载一些东西,而它从来没有首先加载它,而且我不知道为什么它无论如何都不加载。

编辑:我们的 Crystal 报告 class 继承自 MvcContainer(Of Controllers.OnDemandReportController),后者继承自 DotNetNuke.Entities.Modules.PortalModuleBase

CrystalReport 的 OnLoad 处理程序从不触发,因此它从不调用基础 classes OnLoad,因此 CrystalReport class 的控制器是Nothing,然后爆炸。

我今天通过修改OnUnload代码来调用控制器初始化逻辑来解决这个问题,这样它就不会得到NullReferenceException,这暴露了[=13]的根本原因=] 处理程序从来没有 运行.

web.config中有一个程序集绑定重定向,如下

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

我们使用 Crystal 报告,它试图调用 System.Web.Extensions 4.0 版本中存在的方法,而 3.5 版本中不存在该方法。

这是向我展示了如何修复我看到的错误消息的post。

Method 'get_EnableCdn' in type 'System.Web.UI.ScriptManager' from assembly 'System.Web.Extensions' does not have an implementation