1

我有一个处理搜索查询的脚本。结果返回时带有一个可排序的标题,因此单击 Lot # 列标题将按批次 # ASC 对结果进行排序。但是,如果您已经对它进行了 ASC 排序(它存储在会话变量中),它将更改它以按批次 # DESC 对其进行排序(并更新该会话变量)。

只要搜索结果中不包含缩略图,所有这些都可以完美运行。当我确实包含它们时(所做的只是将搜索查询更改为包含图像路径,然后为图像列输出图像),一切都会中断。这是发生的事情:

当页面加载时,我response.write(Session["sort"])看看我是如何排序的(ASC 或 DESC)。

如果单击列标题,我会检查新的“order by”列是否已经是“order by”列(也存储在会话变量中Session["orderby"])。

如果之前未将其设置为 order by 变量,则它将排序会话变量设置为 ASC,并将 order by session 变量设置为列名。

如果它以前被设置为 order by 变量,它会检查当前排序会话变量等于什么。如果它等于 ASC,那么它将排序会话变量设置为 DESC,并且会话变量的顺序保持不变。如果它等于 DESC,它将排序会话变量设置为 ASC,并且 order by 变量保持不变。

这部分实际上仍然有效。问题是在处理页面结束时,我再次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 页面打印出排序变量,得到的结果与上次打印出的 .aspx.cs 页面打印的变量相同(这与下一次打印的第一个不同)。

我想我会继续并将逻辑添加到整个 order by/sort 中:

    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";
    }
4

2 回答 2

2

我猜你在 IE 中遇到过这种情况。

此外,我猜测很可能存在无效的图像源,因此它会发回根目录。我们曾经也遇到过这个问题,直到您使用类似FireBugFiddler. 由于Page_Load.

实际上,当图像 URL 失败时,ASP.NET 将在页面的根目录接收请求,从而回发并清除信息。

另外,请遵循@peer 的建议。

于 2012-09-27T15:03:13.693 回答
1

当我读到你的帖子时,我想知道为什么你把变量放在会话中,变量在控件/页面的上下文中,所以你应该把它们放在 ViewState 中。当您将它们放入会话中时,它将在您网站的多个页面上共享,这可能会导致您的行为。我猜当您在站点上使用后退按钮时,您还会有意外的行为,这是由于将变量存储在会话中而不是视图状态中造成的。

将所有 Session 替换为 ViewState(orderBy 和 sort),看看你是否仍然有奇怪的行为。

于 2012-09-27T14:59:49.433 回答