2017-06-19 74 views
0

我有一个asp应用程序与c#后端问题,我正在寻求一些指导。使用会话变量循环处理

我有一个webform,需要两个数字,一个起始号码和一个结束号码,并将其拆分为20个块,将开始号码和结束号码分配给每个块的会话变量,然后将会话变量传递给一个asp页面进行进一步处理,每次只有一个20(或更少)的块。

看来循环迭代直到最后一次,然后推出命令,到那时我的会话变量已被覆盖到'最后一批'。

预期的操作是批量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

这不是页面生命周期的工作方式。你实质上是在等待4个'window.open'调用而不告诉他们要处理什么。您需要为每个重定向生成唯一的会话变量,并将它们传递给'window.open',以便处理正确的批处理。 – mjw

+0

为什么不在查询字符串中传递'SerialStart'和'SerialEnd'?然后每个窗口都可以有自己的范围,因为每个窗口都有自己的URL。 –

+0

我建议给他们链接打开所有的四个窗口,如[在一个按钮上点击打开两个弹出窗口?](https://stackoverflow.com/questions/11535048/how-to-open-two-popup-窗口上点击按钮) –

回答

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 

如果您不需要为除了范围边界的任何会话变量,你可以杀死一切会议相关的,你应该是在良好的状态。

+0

这是神奇的。我能够让重定向工作得很好,但出于某种原因,我只能打开1个窗口,即使后面的代码正在处理并发送多个具有正确参数的唯一网址,但是您的代码完美无缺。感谢您的帮助。 – SDG