我有一个带有c#后端的asp应用程序的问题,我正在寻求一些指导。
我有一个webform,它接受两个数字,一个起始和结束编号,并将其拆分为20个块,将起始编号和结束编号分配给每个块的会话变量,然后将会话变量传递给asp页面进一步处理,一次20个(或更少)一个块。
似乎循环迭代直到最后一次,然后将命令推出,到那时我的Session变量已被覆盖到最后一批'。
预定的操作将是一批73(示例),将打开4个窗口,1-20用于第一个会话呼叫,21-40用于第二个会话呼叫,41-60用于第三个会话呼叫,以及最后一次会话呼叫的61-73,在每个循环中打开一个新的浏览器窗口,每个批次。现在,我得到4个窗口,但每个窗口只有最后61-73批。
我确实认为这是正常的循环行为,但无论如何都存在吗?
代码示例:
int[] serialArray = Enumerable.Range((Convert.ToInt32(startNum.Text)), 1 +
(Convert.ToInt32(endNum.Text) - Convert.ToInt32(startNum.Text))).ToArray();
bool keepGoing = true;
int index = 0; //starting array number
int endArray = serialArray.Length; //modifying array limit
int yyy = 19; //end array number
while (keepGoing)
{
int[] smallArray = serialArray.Skip(index).Take(20).ToArray();
if (endArray <= 20)
{
reportPopper(serialArray[index], serialArray.Last());
}
else
{
reportPopper(serialArray[index], serialArray[yyy]);
}
if (smallArray.Count() >= endArray)
{
keepGoing = false;
}
endArray -= smallArray.Count();
index += smallArray.Count();
}
然后:
protected void reportPopper(int a, int b)
{
int startNumber = a;
int endNumber = b;
Session["SerialStart"] = startNumber; //batch index start
Session["SerialEnd"] = endNumber; //batch index end
string redirect = "<script>window.open('PrintBatchReport.aspx');</script>";
Response.Write(redirect);
}
答案 0 :(得分:0)
第一个建议(唯一会话变量)和第二个建议(查询字符串)将为您提供每个URL的范围以及唯一的会话变量(如果您需要它们用于弹出窗口之外的其他内容):
protected void reportPopper(int a, int b)
{
Session["SerialStart_" + a.ToString()] = a; //batch index start
Session["SerialEnd_" + b.ToString()] = b; //batch index end
string redirect = String.Format("<script>window.open('PrintBatchReport.aspx?start={0}&end={1}');</script>", a, b);
Response.Write(redirect);
}
现在,在PrintBatchReport.aspx
:
int start = int.Parse(Request.QueryString["start"].ToString());
int end = int.Parse(Request.QueryString["end"].ToString());
var startSession = Session["SerialStart_" + start.ToString()];
var endSession = Session["SerialEnd_" + end.ToString()];
//DO STUFF
如果您不需要除范围边界之外的任何会话变量,您可以杀死与会话相关的所有内容,并且您应该处于良好状态。