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 に答える