簡體   English   中英

如何序列化ViewState對象

[英]How to serialize a ViewState objects

我有一些查詢數據庫的函數,並將結果放入gridview。 它還設置一個包含查詢結果的ViewState變量。 當我回發時,我有一個加載函數,從最后的結果(如果有的話)加載gridview。

我遇到的問題是我收到的錯誤基本上表明viewstate對象需要序列化。 從我所擁有的,我不知道如何做到這一點。

錯誤:Sys.WebForms.PageRequestManagerServerErrorException:序列化值'System.Collections.Generic.List 1[<>f__AnonymousType17 2 [System.Int32,System.String]]'的類型為'System.Collections.Generic.List 1[[<>f__AnonymousType17 2 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],App_Web_rjb524gi ,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null]]。'

我的代碼到目前為止:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Runtime.Serialization;

public partial class PlayersManagement : System.Web.UI.Page
{ 

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        LoadData();
    }
}

public void LoadData()
{

    if (ViewState["CurrentGridView"] != null || ViewState["CurrentGridView"] == "")
    {
        GridViewPlayers.DataSource = ViewState["CurrentGridView"];
        GridViewPlayers.DataBind();
    }
    else
    {

        DBModel.DBEntities context = new  DBModel.DBEntities();

        var players= (from f in context.Players
                        where f.isDeleted == false
                        select new
                        {
                            f.PlayerId,
                            f.PlayerName

                        }).ToList();

        GridViewPlayers.DataSource = players;
        GridViewPlayers.DataBind();
    }

    ViewState["Sort"] = 0;

}


/**
   * This method is for advance search functionality 
   * 
   */
protected void btnSearch_Click(object sender, EventArgs e)
{

    // If the search textbox is not empty
    if (txtSearch.Text.Trim() != "")
    {
        // Call to Entity Model Framework
       DBModel.DBEntities context = new DBModel.DBEntities();

        //Querying the Players table 
        var search = (from s in context.Players
                      where s.PlayerName.Contains(txtSearch.Text.Trim())
                      select new
                      {
                          s.PlayerId,
                          s.PlayerName

                      }).ToList();


        if (search.Count != 0)
        {

            noResults.Visible = false;

            GridViewPlayers.DataSource = search;//Connecting query to the datasource Gridview

            ViewState["CurrentGridView"] = search; // <---- Error cause here

            GridViewPlayers.DataBind();  //Binding Gridview
        }
        else
        {
            noResults.Visible = true;
            noResults.Text = "This '" + txtSearch.Text + "' Query Returned No Results";

            txtSearch.Text = "";

        }


    }

}


 protected void Gridview_Sort(object sender, GridViewSortEventArgs e)
{

    //Label2.Text = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
     DBModel.DBEntities context = new  DBModel.DBEntities();

    var players = (from b in context.Players
                 where b.isDeleted == false
                 select b);

    DataTable gridviewTable = players.CopyToDataTable();

    gridviewTable.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

    GridViewPlayers.DataSource = gridviewTable;

    ViewState["CurrentGridView"] = gridviewTable; <--- Also causes error

    GridViewPlayers.DataBind();

}


private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
    string newSortDirection = String.Empty;

    int sort = (ViewState["Sort"] == null) ? 0 : (int)ViewState["Sort"];
    switch (sort)
    {
        case 0:
            newSortDirection = "ASC";
            ViewState["Sort"] = 1;
            break;

        case 1:
            newSortDirection = "DESC";
            ViewState["Sort"] = 0;
            break;
    }

    return newSortDirection;
}

protected void GridViewPlayers_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridViewPlayers.EditIndex = e.NewEditIndex;
    LoadData();
}


protected void GridViewPlayers_CancelEditRow(object sender, GridViewCancelEditEventArgs e)
{
    GridViewPlayers.EditIndex = -1;
    LoadData();
}

如果你真的想將它存儲在View State中,那么你可能希望有一個可以標記為[Serializable] 看起來匿名類型不是。 所以不要使用:

var search

使用

 List<Player> search =  Query  

和班級。

[Serializable]
public class Player
{
    public int PlayerId {get;set;}
    public string PlayerName {get;set;}
}

但是,看起來你每次都在查詢數據庫,所以即使你在視圖狀態中存儲也不會獲得任何東西。

問題是,您無法使用ViewState傳遞匿名對象。 一種解決方案是創建強類型模型,並使用它們代替匿名對象。 創建一個Player類:

public class Player
{
    public Int32 PlayerId { get; set; }
    public String PlayerName { get; set; }
}

並像這樣使用它:

var search = (from s in context.Players
    where s.PlayerName.Contains(txtSearch.Text.Trim())
    select new Player
    {
        PlayerId = s.PlayerId,
        PlayerName = s.PlayerName

    }).ToList();

代替:

var search = (from s in context.Players
    where s.PlayerName.Contains(txtSearch.Text.Trim())
    select new
    {
        s.PlayerId,
        s.PlayerName

    }).ToList();

對所有動態結果(更改它們以使用具體類)和綁定resp執行此操作。 序列化 通過ViewState傳遞應該正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM