我有一个包含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>
我有OnLoad
,OnUnload
的重载,并且每个都有登录。
当我在本地导航到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
,并且会爆炸。
答案 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版本中不存在。
这是向我展示如何修复我看到的错误消息的帖子。