2017-06-19 82 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