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