2017-06-19 16 views
0

私はC#バックエンドでaspアプリケーションに問題があり、いくつかのガイダンスを求めています。セッション変数を使用したループ処理

私は開始番号と終了番号の2つの番号を取り、それを20のブロックに分割し、各ブロックのセッション変数に開始番号と終了番号を割り当て、セッション変数をASPに渡しますページを追加処理するために、一度に20(またはそれ以下)の1つのブロック。

最後にループが繰り返されてからコマンドがプッシュされるようですが、そのときに私のSession変数は '最後のバッチ'に上書きされています。

バッチ73の場合(例)、4つのウィンドウが開かれ、最初のセッションコールでは1〜20、2番目のセッションコールでは21-40、3番目のセッションコールでは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

[ボタンをクリックすると2つのポップアップウィンドウを開くにはどうすればいいですか?](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つのウィンドウしか開くことができず、正しいコードで複数の一意のURLを送信していましたが、このコードは完全に機能します。ご協力ありがとうございました。 – SDG

関連する問題