从ASP.NET MVC应用程序向远程SSRS报告传递参数

从ASP.NET MVC应用程序向远程SSRS报告传递参数,asp.net,asp.net-mvc,reporting-services,Asp.net,Asp.net Mvc,Reporting Services,我有一个ASP.NET MVC应用程序,它使用SSR进行报告(使用web表单和报告查看器)。我想将两个参数动态地传递给远程报告。我当前的实现将参数存储在会话中,该会话在VS Development Server上运行良好,但在web表单中检索时,IIS上的变量为null 下面是调用视图的控制器方法 public ActionResult ShowReport(string id) { var reportParameters = new Dictionary<

我有一个ASP.NET MVC应用程序,它使用SSR进行报告(使用web表单和报告查看器)。我想将两个参数动态地传递给远程报告。我当前的实现将参数存储在会话中,该会话在VS Development Server上运行良好,但在web表单中检索时,IIS上的变量为null

下面是调用视图的控制器方法

    public ActionResult ShowReport(string id)
    {
        var reportParameters = new Dictionary<string, string>();
        reportParameters.Add("Param1", id);
        reportParameters.Add("Param2", "user1");
        Session["reportParameters"] = reportParameters;

        return View("ReportName");
    }
public ActionResult ShowReport(字符串id)
{
var reportParameters=新字典();
reportParameters.Add(“Param1”,id);
reportParameters.Add(“Param2”、“user1”);
会话[“reportParameters”]=reportParameters;
返回视图(“报告名称”);
}
下面是我如何尝试从web表单检索参数

    protected void Page_Load(object sender, EventArgs e)
    {
        var reportParameters = (Dictionary<string, string>)Session["reportParameters"];

        foreach (var item in reportParameters)
        {
            ReportParameter rp = new ReportParameter(item.Key, item.Value);
            ReportViewer1.ServerReport.SetParameters(rp);
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
var reportParameters=(字典)会话[“reportParameters”];
foreach(reportParameters中的var项)
{
ReportParameter rp=新的ReportParameter(item.Key,item.Value);
ReportViewer1.ServerReport.SetParameters(rp);
}
}
有人知道会话[“reportParameters”]为什么为空吗?
或者是否有其他方法传递这些参数?

问题在于
会话[“reportParameters”]
为空,还是没有将任何参数添加到报告中?因为您的代码目前不会向报表中添加参数,即使您正确地传递了这些参数,因此报表参数将为null

接受
IEnumerable
(通常是
列表
),而不是
ReportParameter
对象。您的代码应该更像这样:

protected void Page_Load(object sender, EventArgs e)
{
    var reportParameters = (Dictionary<string, string>)Session["reportParameters"];
    List<ReportParameter> parameters = new List<ReportParameter>();

    foreach (var item in reportParameters)
    {
        parameters.Add(new ReportParameter(item.Key, item.Value););
    } 
    ReportViewer1.ServerReport.SetParameters(parameters);
}
受保护的无效页面加载(对象发送方,事件参数e)
{
var reportParameters=(字典)会话[“reportParameters”];
列表参数=新列表();
foreach(reportParameters中的var项)
{
添加(新的ReportParameter(item.Key,item.Value););
} 
ReportViewer1.ServerReport.SetParameters(参数);
}
您也可以这样做:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            try
            {

                var js = new JavaScriptSerializer();
                string reportPath= Request.QueryString["LocalReport"];
                string parametersTemp = Request.QueryString["ParametersReport"];
                List<ReportParameter> parameters = null;

                if (parametrosTemp != "")
                {
                    parameters = JsonConvert.DeserializeObject
                                            <List<ReportParameter>>(parametrosTemp);
                }

                GenerateReport(reportPath, parameters );
            }
            catch (Exception ex) {
                statusReport.Value = ex.Message;
            }

        }
     }



    private void GenerateReport(string reportPath, List<ReportParameter> reportParameters)
    {

        reportCurrent.ProcessingMode = ProcessingMode.Remote;
        ServerReport serverReport = reportCurrent.ServerReport;

        serverReport.ReportServerUrl =
            new Uri(AppSettings.URLReportServer);
            serverReport.ReportPath = reportPath;
        serverReport.Refresh();

        if (reportParameters != null)
        {
          reportCurrent.ServerReport.SetParameters(reportParameters);
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!Page.IsPostBack)
{
尝试
{
var js=新的JavaScriptSerializer();
string reportPath=Request.QueryString[“LocalReport”];
字符串parametersTemp=Request.QueryString[“ParametersReport”];
列表参数=null;
if(parametrosTemp!=“”)
{
参数=JsonConvert.DeserializeObject
(parametrosTemp);
}
GenerateReport(报告路径、参数);
}
捕获(例外情况除外){
statusReport.Value=ex.Message;
}
}
}
私有void生成器报告(字符串报告路径,列表报告参数)
{
reportCurrent.ProcessingMode=ProcessingMode.Remote;
ServerReport ServerReport=reportCurrent.ServerReport;
serverReport.ReportServerUrl=
新Uri(AppSettings.URLReportServer);
serverReport.ReportPath=ReportPath;
serverReport.Refresh();
if(reportParameters!=null)
{
reportCurrent.ServerReport.SetParameters(reportParameters);
}
}