我的asp.net Web应用程序中有一个水晶报告,它有很多报告参数(大约15个)。以前我使用查询字符串来传递它们,但这是不安全的。
现在我将所有参数映射到Hashtable,将它们存储在session&传递给报表查看器。现在,如果用户在不同的浏览器选项卡中打开多个报表实例,会话值就会搞乱。当我浏览页面时,会显示错误的报告。
请告诉我将参数传递给报告的好方法。
达明。
答案 0 :(得分:1)
会话对象在同一浏览器的多个选项卡之间共享,因为服务器仅为浏览器存储一个会话cookie。因此,单个浏览器上的几个选项卡中的值会很明显。
可能的解决方案之一: 使用ViewStates而不是session来存储HashTable。
请参阅下面的代码进行演示,为简单起见,我使用的是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);
}
}
}
}
由于Viewstates在页面级别工作,因此这次集合中的值不会搞乱。
希望这有帮助。
答案 1 :(得分:1)
如何创建一个简单的DTO来存储所有报告参数。将此DTO保存在会话中,并在查看器控件所在的报表查看器页面中进行访问。
要在用户在浏览器中打开多个实例时跨越会话问题,您可以执行一个简单的操作。当用户提供参数并单击“显示报告”时,此时使用key作为此guid在会话内创建一个guid,store值,并将此guid作为查询字符串参数传递给报表查看器页面。这样,报表查看器页面的每个实例都可以识别要引出的会话值。
像这样的东西
public class AttendanceDTO
{
public int EmployeeId {get;set;}
public string Month {get;set;}
}
然后在“报告参数页面”
中 /* JUST NOTEPAD CODE, SYNTAX MIGHT VARY */
protected override ShowReport_Click(object sender, EventArgs e)
{
string guid = new Guid();
AttendanceDTO dto = new AttendanceDTO()
{ EmployeeId = txtEmployee.Text;
Month = txtMonth.text
};
session[guid] = dto;
Response.Redirect("ReportViewer.aspx?Guid=" + guid);
}
然后在报告查看器页面内
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
[您需要确保在使用后清除相应的会话值。] [上面的代码只是来自记事本给你一个想法。除此之外,您还可以带来更多创新]