如何在VS2010项目中使用来自VS 2008的SSRS ReportViewer?

3
我正在开发一个ASP.NET MVC 2 / .NET 3.5项目,其中包括SSRS 2008报表。在迁移到VS 2010 RC后,新的Web Forms报表查看器给了我很多麻烦,我想再次使用来自VS 2008的旧报表查看器。现在我只想知道最简单的方法是什么。
报表查看器嵌入在Webforms ASPX文件中,由MVC视图通过IFrame加载。目前,报告参数存储为会话变量,出于安全原因,我不想将其更改为HTTP POST或GET参数。因此,我不能将报表查看器放在单独的应用程序中,并使用VS2008构建它。
将整个项目移回VS 2008不是选项。
那么,对我来说在VS 2010中使用VS 2008 ReportViewer的最简单方法是什么?是否有一种方法可以从VS 2008中获取程序集并在我的项目中使用它?
谢谢,
Adrian 编辑: 我在使用VS2010版本的ReportViewer时遇到的问题与AJAX请求有关。例如,AsyncRendering=True无法加载报表,而使用分页控件或重新加载按钮也无法正常工作。导出按钮可以正常工作,但这是因为它与AJAX请求无关。

如果您有任何想法可以解决这个问题,我真的很希望能继续使用新的报表查看器。 只是我之前在SO、social.msdn.com和MS Connect上询问过此事,但仍未找到答案。


希望你已经在Connect上报告了你在http://connect.microsoft.com/visualstudio/遇到的所有问题。 - John Saunders
是的,我有。请看我的上面的编辑。 - Adrian Grigore
Adrian,我在你相关问题的帖子中又发布了一个关于原始问题的答案,因为它更直接。 - Jerry Bullard
2个回答

4

根据您所遇到的问题,您有几个选项。如果这些建议对您无效,请更详细地描述您在控件方面遇到的问题。例如,您是否在设计器中遇到了问题、Microsoft 更改了其功能或API,或者是在运行时出现异常?

  • 如果问题与报表查看器的API或运行时行为有关,并且您已经安装了VS 2008和VS 2010,则可以非常容易地移除项目引用下的Microsoft.ReportViewer.WebForms的2010版本(实际上是版本10.0)。然后您可以使用添加引用对话框来选择来自2008年的版本(实际上是版本9.0)。您还需要更新每个使用报表查看器的页面,并将版本10的声明替换为以下版本9的声明。

在每个页面中,将以下内容替换:

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>

使用:

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>

在web.config中替换以下内容:
<add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
<add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />

使用:

<add assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>

在web.config文件中,将以下内容替换为:
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />

使用:

<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>

在web.config中替换以下内容:

<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

随着:

<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  • 如果你只是对设计器崩溃或者有其他问题的话,你可以将控件的2010版本包装在用户控件或自定义控件中,然后在页面中使用它。虽然设计器体验不是很好,但如果设计器是你的问题,这可能是避免崩溃或其他问题的最佳解决方案。

  • 如果你仍然无法使它正常工作,你可以返回到 VS2008,并将报表查看器的2008版本封装在自定义服务器控件中。然后在你的2010项目中引用你的新控件。同样地,这种方式会失去设计器支持。

除了这些步骤,你还应该登录Microsoft Connect并详细报告你遇到的问题,以便他们可以修复并在Visual Studio 2010的RTM(或补丁)中包含它。


非常感谢您详细的回答。我遇到的ReportViewer问题与AJAX请求有关。我已在帖子的第一个编辑中列出了详细信息。如果您有任何想法如何解决这些问题,我实际上更喜欢使用新的ReportViewer。但如果没有其他办法,我会尝试按照您建议的替换引用。 - Adrian Grigore

4

Brian Hartman有一个专门介绍报表查看器的博客,涉及到这个主题: 异步渲染和相关问题

ASP.Net ReportViewer控件上的AsyncRendering属性是ReportViewer上最容易被误解的属性之一。这是我们的错。设置此属性会产生许多副作用,这些副作用可能与名称不符。事实上,大多数情况下,我看到用户设置此属性时,他们所做的是为了获得副作用,而不是为了实现其真正的意图。在Visual Studio 2010中,这些副作用已经消失,因为您可以在任何模式下获取所需的效果。但是要理解事物如何发生变化,让我们首先了解一些背景信息。
AsyncRendering的意图
传统上,Web页面的HTML只有在页面上的所有Web控件都生成其内容后才发送到浏览器。对于文本框和按钮等控件,这是很有道理的。但是ReportViewer比这复杂得多。生成报表的HTML可能需要很长时间。在大多数情况下,将其余页面返回给浏览器,然后异步获取报告内容更加合理。这使用户可以与其余页面交互,并看到“加载指示器”,以便他们知道服务器正在处理某些内容。这是默认行为- AsyncRendering = true。
但是也有一些情况,您希望阻止整个页面直到报告被处理为止。一个好例子是呈现几个小报告的仪表板类型页面,可能每个报告都包含一个单独的图表或小表。在这种情况下,您可能不希望用户被多个等待指示器淹没。如果您知道报告处理很快,则在短时间内阻止页面可能是更好的整体体验。这是AsyncRendering = false的意图。
Visual Studio 2005和2008中的异步模式
您选择的模式对最终生成的HTML有重大影响。 ReportViewer控件最初设计时早在ASP.Net AJAX出现之前。当您同步呈现报告时,报告内容的HTML直接嵌入整个页面中。但是当您异步呈现时,ReportViewer使用帧。帧内容由浏览器单独检索,因此它允许主页面在单独请求Web服务器生成报告时可见。
框架是AsyncRendering所有副作用的根源。使用框架会导致以下两种模式之间的差异:
1.文档映射仅在异步模式下可见,部分原因是它依赖于框架来处理相对于报告区域的调整大小。
2.因为报告在帧中呈现而不是托管查看器的ASP.Net页面的一部分,所以开发人员没有机会处理处理报告时发生的事件。在此领域最常见的投诉是呈现异步时无法处理ReportError事件。
3.框架的大小对查看器的计算很困难,因此通常是错误的。它基于查看器的调整大小模式(百分比或固定大小),工具栏的高度和参数的存在。这是在查看器中看到过多滚动条的主要原因,特别是在使用标准模式或非IE浏览器时。开发人员经常切换到同步呈现以缓解这种情况。
4.与框架大小相似的问题是异步模式下忽略SizeToReportContent属性。帧不根据内容调整其大小,因此没有简单的方法来显示嵌入页面的任意报告而没有滚动条,除非您切换到同步模

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接