2012-09-27 72 views
1

我有一個處理搜索查詢的腳本。結果將返回一個可排序的標題,因此單擊Lot#列標題將按批次#ASC對結果進行排序。但是,如果你已經將它存儲在ASC中(它存儲在一個會話變量中),它將會改變它的排序順序,並按批次#DESC進行排序(並更新該會話變量)。頁面處理之間的會話變量值更改以某種方式

只要縮略圖不包含在搜索結果中,所有這些都可以很好地工作。當我包含它們(所有這些都會改變搜索查詢以包含圖像路徑,然後輸出圖像列的圖像)時,它會全部中斷。這裏是發生了什麼:

當頁面加載,I response.write(Session["sort"])看我如何排序(ASC或DESC)。

如果單擊列標題,我檢查新的「order by」列是否已經是「order by」列(也存儲在會話變量Session["orderby"]中)。

如果它以前沒有設置爲變量順序,它將排序會話變量設置爲ASC,並將會話變量的順序設置爲列名稱。

如果以前將它設置爲變量順序,它將檢查當前排序會話變量等於什麼。如果它等於ASC,則它將排序會話變量設置爲DESC,並且會話變量的順序保持不變。如果它等於DESC,它將排序會話變量設置爲ASC,並且變量順序保持不變。

這部分實際上仍然適用。問題是,在處理頁面結束時,我再次response.write(Session["sort"])查看變量已設置爲。這是頁面加載到屏幕之前發生的最後一件事。所以請記住,當頁面被擊中時,首先發生的事情就是打印出排序會話變量,最後一件事是再次打印變量。因此,當頁面中包含圖像時,單擊一列將導致它對ASC或DESC進行排序(取決於我點擊哪一列,因爲它似乎與其他列交替顯示)。因此,可以說我點擊的列導致第一個response.write(Session["sorty"])爲空(因爲它尚未設置),第二個打印ASC。當我再次點擊列時,第一個將打印DESC(它應該是ASC,因爲在最後一個打印和第一個打印之間沒有任何變化),第二個再次打印ASC。

所以不知何故,會話變量在頁面加載之間發生變化,當最後一次打印和第一次打印之間絕對不存在頁面處理時。 (在其他每一列中,它都是相反的,每次都會在頂部顯示ASC,並在底部顯示DESC)。再說一次,沒有圖像的情況下,此功能完美無缺。

下面是與縮略圖的唯一代碼包括腳本吧:

if (Session["incThumb"] != null) 
    { 
     resultText += "<table style=\"width:100%;\">\n<tr style=\"font-weight:bold;text-align:left;\">\n<th style=\"border-bottom:1px solid #000;\">Thumb</th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_id\">Item ID</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=item_title\">Title</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_lot\">Lot</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_cs_txt_id\">Consignor ID</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblMcat.mcat_name\">Master Category</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblCat.cat_name\">Category</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_est_lo\">Low Est.</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_est_hi\">High Est.</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_reserve\">Reserve</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_status\">Status</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_pr\">Hammer Price</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblMailList.mail_ID\">Bidder ID</a></th>\n</tr>\n"; 
    } 
    else 
    { 
     resultText += "<table style=\"width:100%;\">\n<tr style=\"font-weight:bold;text-align:left;\">\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_id\">Item ID</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=item_title\">Title</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_lot\">Lot</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_cs_txt_id\">Consignor ID</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblMcat.mcat_name\">Master Category</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblCat.cat_name\">Category</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_est_lo\">Low Est.</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_est_hi\">High Est.</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_reserve\">Reserve</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_status\">Status</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblItem.item_pr\">Hammer Price</a></th>\n<th style=\"border-bottom:1px solid #000;\"><a style=\"font-weight:bold; font-color:#000000;\" href=\"searchResults.aspx?page=" + page + "&orderBy=tblMailList.mail_ID\">Bidder ID</a></th>\n</tr>\n"; 
    } 

然後略低於此,我也考慮將它打印出來的時候,SQL的結果,這是(英文),如果會話包含縮略圖的變量不爲空,請爲縮略圖添加額外的表格單元格並添加到圖像中。

不用說,這一個讓我難住。我將不勝感激任何回覆/評論。讓我知道如果你想看到更多的代碼。

編輯

這裏的代碼的Response.Write:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write(Session["sort"] + " 1<br/>"); 
    string orderBy = ""; 

    base.SubNavItems.Add("Search Home", "searchHome.aspx"); 

    if (!IsPostBack) 
    { 
    } 

    if (!String.IsNullOrEmpty(Request.QueryString["page"])) 
    { 
     if (!String.IsNullOrEmpty(Request.QueryString["orderBy"])){ 
      orderBy = Request.QueryString["orderBy"].ToString(); 
     } 
     get_page(Int32.Parse(Request.QueryString["page"].ToString()), orderBy); 
    } 

    if (!String.IsNullOrEmpty(Request.Form["ctl00$ContentPlaceHolder1$save"])) 
    { 
     click_search(); 
    } 

    Response.Write(Session["sort"] + " 1<br/>"); 
} 

是因爲頁面欄標題總是設置,當我列排序的get_page()方法被調用。 orderBy通過查詢字符串設置並傳遞給包含以下代碼的方法protected void get_page(Int32 page, String orderBy)。在該方法的末尾還有一個Response.Write(Session["sort"] + " 2<br/>");行,這是該方法所做的最後一件事。此時沒有其他方法運行。另外,我只是從.aspx頁面打印出了sort變量,並得到了與.aspx.cs頁面打印的變量的最後一個打印輸出相同的結果(這與下一次打印的第一個變量不同)。

我想我會繼續和由/排序邏輯添加到整個訂單:

if (Session["orderBy"] != null) 
    { 
     if (Session["orderBy"].ToString() == orderBy) 
     { 
      if (Session["sort"].ToString() == "ASC") 
      { 
       Session["sort"] = "DESC"; 
      } 
      else 
      { 
       Session["sort"] = "ASC"; 
      } 
     } 
     else if (!String.IsNullOrEmpty(orderBy)) 
     { 
      Session["sort"] = "ASC"; 
      Session["orderBy"] = orderBy; 
     } 
    } 
    else if (!String.IsNullOrEmpty(orderBy)) 
    { 
     Session["sort"] = "ASC"; 
     Session["orderBy"] = orderBy; 
    } 
    else 
    { 
     Session["sort"] = "ASC"; 
     Session["orderBy"] = "tblItem.item_id"; 
    } 
+1

是'sorty'而不是'sort'錯字,還是我錯過了什麼? (只發生在一個地方)。順便說一下,可怕的意大利麪條 –

+0

@RaphaëlAlthaus不,這是在實際的代碼(我剛剛修復,謝謝),但修復它並沒有解決這個問題。謝謝你的發現。 – James

+1

你打電話給你最後一塊代碼是怎麼回事?這聽起來像你可以一次調用它_before_'Page_Load',一次_during_'Page_Load'。 – Rawling

回答

2

我想猜你在IE中遇到這種情況。

此外,我猜測可能是因爲有一個圖片源無效,所以它會回傳到根目錄。我們也曾經遇到過這個問題,直到你用類似FireBugFiddler的方式觀看網絡流量時,才從未發現它。由於存在於Page_Load中的代碼,我們的應用程序過去只是從註銷中退出。

實際上,當圖片URL失敗時,ASP.NET將在頁面的根部接收請求並因此回發並清除信息。

另外,請按照@更改建議。

+0

我實際上使用Firefox,甚至在Chrome上嘗試過。但是,第一張圖片沒有正確回放。這似乎正是發生了什麼事情。有沒有辦法阻止這種情況發生?我嘗試把我的函數調用放在!IsPostBack檢查中,但是這並沒有改變任何東西。 – James

+0

此外,我會檢查文件是否存在,但它說有一個文件名「.jpg」,它正在嘗試使用...我現在已經做了一個帶改變,但希望有一個永久的變化。雖然bandaid更改解決了我的問題,但在其他情況下可能會失敗。 – James

+1

該帖子是2歲,但它幫助我發現我的網站上有一個問題,我的老闆想要1像素的營銷跟蹤。我想說一聲謝謝! – Deverill

1

當我讀你文章中,我想知道爲什麼你把這些變量在會話中,變量是在控制/頁面的上下文中,所以你應該把它們放在ViewState中。當您將它們放入會話中時,它將在您網站的多個頁面上共享,這可能會導致您的行爲。我想,當你在你的網站上使用後退按鈕時,你也會有意外的行爲,這是由會話中的變量存儲而不是視圖狀態引起的。

將所有Session替換爲ViewState(orderBy和sort),看看你是否仍然有奇怪的行爲。

+0

我其實這樣做是爲了讓它們在頁面之間共享,因爲我確實在其他頁面上使用它們。但是,我沒有離開這個頁面就遇到了這個問題。不過,我會繼續嘗試。 – James