1

我厌倦了想知道这个问题的问题。已经为此阅读了很多博客和论坛,但我无法找出问题所在。

我正在使用“SQLServer”模式来存储会话。

一切正常。但是每当我在我的网站中使用搜索功能时,它都会引发以下错误:

“无法序列化会话状态。在 'StateServer' 和 'SQLServer' 模式下,ASP.NET 将序列化会话状态对象,因此不允许不可序列化的对象或 MarshalByRef 对象。如果类似的序列化,同样的限制适用由自定义会话状态存储在“自定义”模式下完成。”

我假设这是因为我在该页面上使用了分页代码。该代码如下:

 protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string query = "select xxxxqueryxxxx";
        SqlDataAdapter da = new SqlDataAdapter(query, con);
        DataSet ds = new DataSet();
        try
        {
            using (con)
            {
                con.Open();
                da.Fill(ds);
            }
        }
        catch
        {
            ds = null;
        }
        finally
        {
            if (ds != null)
            {
                CustomPaging page = new CustomPaging();
                DataTable dt = ds.Tables[0];
                page.PageSize = 10;
                page.DataSource = dt;
                page.CurrentPageIndex = 0;
                no = 1;
                Session["DT"] = dt;
                Session["page"] = page;
                bindData(page, dt);

                //set these properties for multi columns in datalist
                DataList2.RepeatColumns = 1;
                DataList2.RepeatDirection = RepeatDirection.Horizontal;
            }
        }
    }
}
void bindData(CustomPaging page, DataTable dt)
{
    try
    {
        DataList2.DataSource = page.DoPaging;
        DataList2.DataBind();
        //DataList2.DataSource = SqlDataSource1;
        //DataList2.DataBind();
        lbtnPre.Enabled = !page.IsFirstPage; //Enable / Disable Navigation Button
       // lbtnPre.CssClass = "disabledbtn";
        lbtnNext.Enabled = !page.IsLastPage;
        //lbtnNext.CssClass = "disabledbtn";
        lblStatus.Text = NavigationIndicator(); //Build Navigation Indicator 
        //for creating page index
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("PageIndex");
        dt1.Columns.Add("PageText");

        for (int i = 0; i < page.PageCount; i++)
        {
            DataRow dr = dt1.NewRow();
            dr[0] = i;
            dr[1] = i + 1;
            dt1.Rows.Add(dr);
        }
        dlPaging.DataSource = dt1;
        dlPaging.DataBind();
        dlPaging.RepeatColumns = 10;
        dlPaging.RepeatDirection = RepeatDirection.Horizontal;
    }
    catch (Exception)
    {
    }
    finally
    {
        page = null;
    }
}
string NavigationIndicator()
{
    string str = string.Empty;     //Page x Of Y
    str = Convert.ToString(((CustomPaging)Session["page"]).CurrentPageIndex + 1) + " of " + ((CustomPaging)Session["PAGE"]).PageCount.ToString() + " Page(s) found";
    return str;
}
protected void lbtnPre_Click(object sender, EventArgs e)
{
    int pageIndex = ((CustomPaging)Session["page"]).CurrentPageIndex;
    if (!((CustomPaging)Session["page"]).IsFirstPage)
        //Decrements the pageIndex by 1 (Move to Previous page)
        ((CustomPaging)Session["page"]).CurrentPageIndex -= 1;
    else
        ((CustomPaging)Session["page"]).CurrentPageIndex = pageIndex;

    //Binds the DataList with new pageIndex
    bindData(((CustomPaging)Session["page"]), ((DataTable)Session["DT"]));
}
protected void lbtnNext_Click(object sender, EventArgs e)
{
    int pageIndex = ((CustomPaging)Session["page"]).CurrentPageIndex;
    if (!((CustomPaging)Session["page"]).IsLastPage)
        //Increments the pageIndex by 1 (Move to Next page)
        ((CustomPaging)Session["page"]).CurrentPageIndex += 1;
    else
        ((CustomPaging)Session["page"]).CurrentPageIndex = pageIndex;

    //Binds the DataList with new pageIndex
    bindData(((CustomPaging)Session["page"]), ((DataTable)Session["DT"]));
}
protected void DataList2_SelectedIndexChanged(object sender, EventArgs e)
{
    Response.Redirect("Default2.aspx?partnumber=" + DataList2.DataKeyField[DataList2.SelectedIndex].ToString());
}
protected void dlPaging_ItemCommand(object source, DataListCommandEventArgs e)
{
    if (e.CommandName == "Select")
    {
        no = int.Parse(e.CommandArgument.ToString()) + 1;
        ((CustomPaging)Session["page"]).CurrentPageIndex = int.Parse(e.CommandArgument.ToString());
        //Binds the DataList with new pageIndex
        bindData(((CustomPaging)Session["page"]), ((DataTable)Session["DT"]));

    }
}
protected void dlPaging_ItemDataBound(object sender, DataListItemEventArgs e)
{
    LinkButton btn = (LinkButton)e.Item.FindControl("lnkbtnPaging");

    if (btn.Text == no.ToString())
    {
        btn.ForeColor = System.Drawing.Color.Maroon;
        btn.Font.Underline = false;
    }
    else
    {
        btn.ForeColor = System.Drawing.Color.DarkCyan;
        btn.Font.Underline = false;
    }
}

我只想知道编码中的问题是什么以及“如何序列化会话”?我应该做些什么来改进编码?

任何帮助将不胜感激。

谢谢你

4

1 回答 1

1

我猜您的自定义分页控件不可序列化。这一定是问题的原因。

无论如何,将控件存储在会话中并不是一个好主意。只需存储几个可序列化的属性,这些属性可以重建控件(PageSize 和 CurrentPageIndex),或者将它们传递到查询字符串中。

如果可以的话,你也可以使用 ViewState

关于将 DataTable 存储在 Session 中,如果您有大量数据和许多连接的用户,这可能是一个非常糟糕的主意。

于 2013-03-13T11:45:40.203 回答