使用会话变量进行循环处理

时间:2017-06-19 20:43:25

标签: c# asp.net loops session

我有一个带有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);
}

1 个答案:

答案 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

如果您不需要除范围边界之外的任何会话变量,您可以杀死与会话相关的所有内容,并且您应该处于良好状态。