会话变量值以某种方式在页面处理之间变化

时间:2012-09-27 14:28:09

标签: c# asp.net session-variables

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

只要缩略图不包含在搜索结果中,所有这一切都能完美运行。当我包括它们(所有这一切都是改变搜索查询以包括图像路径,然后输出图像列的图像),它都会中断。以下是发生的事情:

当页面加载时,我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页面打印的变量的最后一次打印相同的结果(这与下次打印的第一次打印不同)。

我想我会继续通过/ 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";
    }

2 个答案:

答案 0 :(得分:2)

我猜你会在IE中体验到这一点。

此外,我猜测可能存在无效的图像源,因此它会回发到根目录。我们曾经遇到过这个问题,在您使用FireBugFiddler等网络流量观看网络流量之前,您从未发现过这个问题。由于Page_Load中存在的代码,我们的应用程序通常只是注销。

有效的情况是,当图像URL失败时,ASP.NET将在页面的根目录接收请求,从而回发并消除信息。

另外,请关注@peer建议。

答案 1 :(得分:1)

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

将所有会话替换为ViewState(orderBy和sort),看看你是否还有奇怪的行为。