Control OnLoad永远不会发生,但是OnUnload会发生

时间:2015-01-06 16:18:35

标签: asp.net asp.net-mvc vb.net dotnetnuke

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

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

标记

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

我的子控件名为CrystalReport.ascx,继承自PortalModuleBase命名空间中的DotNetNuke.Entities.Modules。此子控件包含一个多视图,第一个视图允许您选择要传递给报表的参数,第二个视图包含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与dev中的web.config进行比较,除连接字符串外,它们几乎完全相同。我以为可能有一些我们搞砸了的Crystal Reports配置,所以我们完全重新安装它,我们仍然得到同样的错误。 我不知道接下来要去哪里看看,我有点等待他们重新启动服务器后看到它的样子,所以我要问这是否有人看到类似的东西,OnLoad事件不要开火,但OnUnload会这样做。它似乎很奇怪,当它从未加载它时会尝试加载它,并且我不知道它为什么不加载它。

编辑:我们的CrystalReport类继承自MvcContainer(Of Controllers.OnDemandReportController),继承自DotNetNuke.Entities.Modules.PortalModuleBase

CrystalReport的OnLoad处理程序永远不会触发,因此它永远不会调用基类OnLoad,因此CrystalReport类的控制器为Nothing,并且会爆炸。

1 个答案:

答案 0 :(得分:0)

我今天解决了这个问题,修改了OnUnload代码来调用控制器初始化逻辑,这样它就不会得到NullReferenceException,这就暴露了{{1}的原因。处理程序从未运行过。

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

OnLoad

我们使用Crystal报表,它试图调用4.0版本<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> 中存在的方法,该方法在3.5版本中不存在。

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

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