65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Iframe 和 URL 命令方法集成 SSRS 和 .NET

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (5投票s)

2011 年 5 月 13 日

CPOL

4分钟阅读

viewsIcon

99360

downloadIcon

1714

本文将介绍使用 URL 命令和 IFrame 方法在 ASP.NET UI 中打开 SSRS 报表的方法。

目录

  1. 引言
  2. 问题陈述
  3. 必备组件
  4. 实施步骤与方法
  5. 摘要
  6. 参考文献
fig1.JPG

引言

撰写本文的初衷是想说明,我们可以在不使用报表查看器 Web 部件的情况下,解决在 Web 应用程序中打开 SSRS 报表的问题。当需要显示带有用户定义的 .NET 搜索控件的自定义 SSRS 报表时,会遇到许多挑战。

通过以下实现方法,我们可以在不使用报表查看器 Web 部件的情况下,非常成功地将 SSRS 远程 rdl 报表渲染到 MOSS 门户中。这种方法很简单。简单的解决方案是利用 IFrame 概念和页面查看器 Web 部件。一旦深入阅读本文,您将能详细了解具体的实现方法。

问题陈述

在实际的业务场景中,有时我们需要为客户提供自定义报表,这时我们会发现 SSRS 报表框架的局限性。.NET 提供了非常有限的搜索控件,这与 SSRS 不同。为了克服这一限制,下面的实现和思路可以帮助构建用户界面最友好的报表。

其概念是通过**报表命令 URL** 将远程 SSRS 报表调用到 .NET 中。利用 SSRS 的这一特性,我们可以将 SSRS 元数据暴露给 .NET 环境。此外,我们可以通过 POST 表单或 `Get` 方法将输入参数从 .NET 传递给 SSRS 报表。然后,又一个挑战是如何在没有报表查看器控件的情况下将 SSRS 报表嵌入到 .NET 中,这可以通过 HTML 的 IFrame 功能来解决。

必备组件

前提条件是读者必须熟悉 SSRS 概念以及 MOSS/SharePoint 报表查看器 Web 部件。SQL Server 2005 SSRS、MOSS 2007 和 .NET 2.0。

实施步骤与方法

步骤 1:创建 SSRS 报表 RDL 文件

使用 BIDS IDE 创建一个简单的 SSRS 报表。在“布局”部分添加三个文本框。目的是展示 SSRS 数据来自 .NET 的权衡。这种集成将帮助您基于此解决方案构建更复杂的解决方案。

创建三个隐藏的报表参数,例如 `Report_Parameter_0`、`Report_Parameter_1` 和 `Report_Parameter_2`。创建这些参数后,向上述每个文本框添加一个表达式,并将相应的值赋给这些参数。

您可以下载源代码并查看具体实现。创建起来非常简单易行。

步骤 2:将 RDL 文件上传到报表管理器

将 RDL 文件上传到 SSRS 报表文件夹的报表管理器中。如果 RDL 没有错误,就可以顺利上传到报表管理器报表文件夹中。

请记下上传到报表管理器中的报表的 URL。URL 大致如下:

步骤 3:ASP.NET 中的自定义输入字段

现在是时候编写一些 .NET 代码了。目的是集成 .NET 和 SSRS 报表。在这里,我们将把远程 SSRS 报表嵌入到 .NET 窗体中,而无需使用报表查看器控件。

此实现的关键部分是使用 JavaScript 调用服务器端代码。在运行时,我们构造一个表单,并通过服务器端以包含值的隐藏输入字段将其发布到 SSRS 报表的其他网站。RDL 的隐藏报表参数与 ASP.NET 的自定义输入控件之间存在映射。这就是通过 ASP.NET 的 `Post`/`Get` 方法集成这两个系统之间权衡的方式。

下面的代码片段演示了上述插图。总而言之,我们有报表命令 URL,通过它可以控制报表的许多设置,如渲染、格式、输入字段和导出类型等。

SSRS 报表服务器 URL 命令:使用 URL 访问参数

protected void Button1_Click(object sender, EventArgs e)
{           
    first.Text = ConstructForm(TextBox1.Text, TextBox2.Text, TextBox3.Text);
    String strJS = PostFormThroughJS("form1");
    second.Text = strJS;
}
private String PostFormThroughJS(String strFormId)
{
    StringBuilder strScript = new StringBuilder();
    strScript.Append("< script language='javascript'>");
    strScript.Append("var ctlForm = document.forms.namedItem('{0}');");
    strScript.Append("ctlForm.target='Main';");
    strScript.Append("ctlForm.submit();");
    strScript.Append("< /script>");
    return String.Format(strScript.ToString(), strFormId);
}
private String ConstructForm(String strRDLReportParameter0, 
	String strRDLReportParameter1, string strRDLReportParameter2)
{
    StringBuilder strForm = new StringBuilder();
    strForm.Append("< form id=\"form1\" name=\"form1\"  
    action=\"https://xxx/Reportserver?/yyy/Reports/Demo\" method="post">");
    strForm.Append("< input type=\"hidden\" 
    name=\"rs:Command\" value=\"Render\"<");
    strForm.Append("< input type=\"hidden\" 
    name=\"rs:Format\" value=\"HTML4.0\"<");        
    strForm.Append("< input type=\"hidden\" 
    name=\"Report_Parameter_0\" value=\"{0}\"<");
    strForm.Append("< input type=\"hidden\" 
    name=\"Report_Parameter_1\" value=\"{1}\"<");
    strForm.Append("< input type=\"hidden\" 
    name=\"Report_Parameter_2\" value=\"{2}\"<");        
    strForm.Append("< /form >");
    return String.Format(strForm.ToString(), 
    strRDLReportParameter0, strRDLReportParameter1, strRDLReportParameter2);
}   
< html>
<head runat="server">
    <title>Custom Report:SSRS and .Net </title >
</head>
<body>
    <asp:Literal ID="first" runat=server></asp:Literal>
    <asp:Literal ID="second" runat=server></asp:Literal>
    <form id=form2  runat=server target ="Main" >
        <asp:Label ID="Label1" runat="server" 
	Text="Custom Report:SSRS and .Net Integration" Font-Bold="True" 
	Font-Size="11pt"></asp:Label>
        <br />
        <br />
        <span style="font-size: 10pt">
        Name</span>
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>  
        <span style="font-size: 11pt">Location</span>
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <span style="font-size: 11pt">
        Skill</span>
        <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" 
	Text="View Report" />
        <br />
         <br />
        <span style="font-size: 11pt">SSRS Report View</span>
    </form>
  
    
  <IFRAME ID="Main" name="Main" height=500px width=700px runat=server />
</body>
</html>

步骤 4:[可选] 集成、嵌入或发布到 Sharepoint/Moss

(我假设读者熟悉 SharePoint 2007。) 创建一个 ASP.NET 解决方案,并将预编译的程序集部署到 SharePoint 网站的 _Layout 虚拟目录下的子站点中。一旦预编译的程序集被部署到 _Layout 虚拟目录下的子站点 (YYY) 中,在这种情况下,URL 将是 https://xxx.com/_layout/yyy/JumpToSSRS.aspx

下一步是打开 SharePoint 门户,站点管理员将使用站点设置编辑或添加新页面。在给定的页面中,需要添加 PageViewer Web 部件。在 PageViewer Web 部件中,需要修改共享 Web 部件属性,并分配 .NET 相对路径 `_layout/yyy/JumpToSSRS.aspx`。应用这些设置后,发布并签入页面,即可根据角色用户映射进行访问。

fig2.JPG

摘要

我试图在本文中涵盖许多重要内容,以下是主要亮点:

  • 在没有报表查看器 Web 部件的情况下集成 .NET 和 SSRS (URL 命令方法)
  • 在不使用报表查看器 Web 部件的情况下将 SSRS 报表集成到 MOSS 中
  • 使用 IFrame/JavaScript 方法将其他网站的 aspx 嵌入/集成到 ASP.NET 页面中
  • 最重要的突破。使用 SSRS 报表中自定义输入字段/控件的缺点。我已将输入参数控件与 SSRS 解耦,并将其转移到 .NET,以获得更大的灵活性,从而实现 SSRS 和 .NET 之间的顺畅通信。

希望我已经尽力以更合理、最易于理解的方式阐述了这些内容。欢迎提出任何建议或更正。谢谢!

参考文献

© . All rights reserved.