找了很多资料,在MVC3.0 Razor视图下,是无法使用ReportView控件,所以我在MVC3.0项目下添加了.aspx文件
在aspx文件中增加ReportView控件,
<cc1:SMTReportView ID="rptView1" runat="server" ProcessingMode="Remote" Height="100%"
Width="100%" ExportContentDisposition="AlwaysAttachment" ShowExportControls="true"
ShowRefreshButton="false" AsyncRendering="false" ShowFindControls="false" SizeToReportContent="true">
</cc1:SMTReportView>
重写一下ReportViewer,加上下面的重写可以解决chrome中脚本问题
public class SMTReportView : Microsoft.Reporting.WebForms.ReportViewer
{
protected override void Render(HtmlTextWriter writer)
{
using (StringWriter sw = new StringWriter())
{
HtmlTextWriter tmpWriter = new HtmlTextWriter(sw);
base.Render(tmpWriter);
string val = sw.ToString();
val = val.Replace(@"!= 'javascript:\'\''", @"!= 'javascript:\'\'' && false");
writer.Write(val);
}
}
}
在刚开始时的时候没有加SizeToReportContent=true;,在chrome上无法正常显示报表内空,在IE与FF下能正常显示,最后在MSDN中找到这个属性,加上后chrome能正常显示报表内容。但是加上这个属性后存在一个问题,就是初始运行报表时的参数区域不能按宽度正常显示。为了能兼顾这三个浏览器,先就这样了。 在后台绑定报表 this.rptView1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
this.rptView1.ServerReport.ReportServerCredentials = new MyConfigFileCredentials("报表服务登陆帐号", "密码");
#region 是否显示导出 if (entity.ALLOWEXPORT == 1) {
this.rptView1.ShowExportControls = true;
this.rptView1.ShowPrintButton = true;
} else { this.rptView1.ShowExportControls = false; this.rptView1.ShowPrintButton = false; }
#endregion
this.rptView1.ServerReport.ReportServerUrl = new Uri(“报表服务提供的地址”);
IList<ReportParameter> paraList = new List<ReportParameter>();
#region 组装参数
ReportParameter rp = new ReportParameter();
rp.Name = "USERID"; rp.Visible = false;
rp.Values.Add(userId); paraList.Add(rp);
#endregion var rptPath = string.Format("/{0}/{1}", "报表服务器文件路径" "报表名");
//报表服务器文件路径:比如在根目录建了一个文件夹叫 Template 那么这里就传Template
//报表名:这个不需要后缀,只是需要上传的rdl文件名 //再给参数赋值 this.rptView1.ServerReport.SetParameters(paraList); this.rptView1.ServerReport.Refresh(); }
这里面涉及了一个
MyConfigFileCredentials类
好了,如果已经有报表服务提供了报表,那么运行起来可以看到效果[Serializable] public class MyConfigFileCredentials : IReportServerCredentials { // local variable for network credential. private string _UserName; private string _PassWord; public MyConfigFileCredentials(string UserName, string PassWord) { _UserName = UserName; _PassWord = PassWord; } public WindowsIdentity ImpersonationUser { get { return null; } } public ICredentials NetworkCredentials { get { return new NetworkCredential(_UserName, _PassWord);//windows的用户名和密码 } } public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority) { authCookie = null; userName = null; password = null; authority = null; return false; } }