Asp.net 如何将多个参数传递到crystal报表?

Asp.net 如何将多个参数传递到crystal报表?,asp.net,Asp.net,在我的asp.net web应用程序中有一个crystal报表,它有很多报表参数(大约15个)。以前我是用querystring通过他们,但这是不安全的 现在,我将所有参数映射到一个哈希表,将它们存储在会话中并传递给报表查看器。现在,如果用户在不同的浏览器选项卡中打开多个报表实例,会话值就会混乱。当我浏览页面时,会显示错误的报告 请告诉我一个好的方法,以通过我的参数报告 Damien.会话对象在同一浏览器的多个选项卡之间共享,因为服务器只为浏览器存储一个会话cookie。因此,很明显,在单个浏览

在我的asp.net web应用程序中有一个crystal报表,它有很多报表参数(大约15个)。以前我是用querystring通过他们,但这是不安全的

现在,我将所有参数映射到一个哈希表,将它们存储在会话中并传递给报表查看器。现在,如果用户在不同的浏览器选项卡中打开多个报表实例,会话值就会混乱。当我浏览页面时,会显示错误的报告

请告诉我一个好的方法,以通过我的参数报告


Damien.

会话对象在同一浏览器的多个选项卡之间共享,因为服务器只为浏览器存储一个会话cookie。因此,很明显,在单个浏览器的多个选项卡中会出现值混乱

可能的解决方案之一: 使用ViewState而不是会话来存储哈希表

请参阅下面的代码以获取演示,为了简单起见,我使用了ArrayList而不是HashTable

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ViewState["ht"] = new ArrayList();
        //initialize viewstate with arraylist on first pageload.
    }

}
protected void btnAddElement_Click(object sender, EventArgs e)
{//adding new elements to the arraylist
    if (ViewState["ht"] != null)
    {
        ArrayList ht = (ArrayList)ViewState["ht"];
        ht.Add(TextBox1.Text);
        ViewState["ht"] = ht;
    }
}
protected void Button2_Click(object sender, EventArgs e)
{
    if (ViewState["ht"] != null)
    {
        ArrayList ht=(ArrayList)ViewState["ht"];
        foreach (object a in ht)
        {//write code to pass parameters to the crystal report
            Response.Write(a);
        }
    }
}
}
由于ViewState在页面级别工作,因此这次集合中的值不会混乱


希望这能有所帮助。

创建一个简单的DTO来存储所有报表参数怎么样。将此DTO保存在会话中,并访问查看器控件所在的报表查看器页面

若要在用户在浏览器中打开多个实例时跨越会话问题,可以执行一个简单的技巧。当用户提供参数并单击“Show Report”时,此时将创建一个guid,将值存储在会话中,使用键作为此guid,并将此guid作为查询字符串参数传递给报表查看器页面。这样,报表查看器页面的每个实例都知道要显示哪个会话值

像这样的

public class AttendanceDTO 
{ 
  public int EmployeeId {get;set;} 
  public string Month {get;set;}
}
然后在“报告参数页”

然后在报告查看器页面中

string guid = Request.QueryString["Guid"]; //Null check etc..
AttendanceDTO dto = (AttendanceDTO) session[guid];
//Provide dto values as parameters to your report viewer control and then clean the session
[您需要确保在使用会话后清除相应的会话值。]
[以上代码来自记事本,为您提供一个想法。除此之外,您还可以带来更多创新]

感谢您的详细回复。问题是,我的报表查看器位于另一页上。用户在页面上设置了一些参数,单击“显示报告”将在Crystal Reports viewer的新页面上重定向。亲爱的Subhash,感谢您的详细回复。这是个好主意。你的意思是在DTO中为GUID创建一个属性,我也应该将该属性与报表参数一起存储在会话中吗?嗨,达米恩,如果这对你有帮助,我会很高兴的。我刚刚用一些例子更新了我的回答,给你一个整体的想法。谢谢Subash。这就是我要找的,把你的标记为答案=)
string guid = Request.QueryString["Guid"]; //Null check etc..
AttendanceDTO dto = (AttendanceDTO) session[guid];
//Provide dto values as parameters to your report viewer control and then clean the session