【问题标题】:How to serialize a ViewState objects如何序列化 ViewState 对象
【发布时间】:2014-06-12 18:03:43
【问题描述】:

我有一些函数可以查询数据库并将结果放入网格视图中。它还设置了一个包含查询结果的 ViewState 变量。当我回发时,我有一个加载函数,可以从最后的结果中加载 gridview(如果有的话)。

我遇到的问题是我收到一个错误,基本上说 viewstate 对象需要被序列化。从我所拥有的情况来看,我不确定该怎么做。

错误:Sys.WebForms.PageRequestManagerServerErrorException:错误 序列化值 'System.Collections.Generic.List1[<>f__AnonymousType172[System.Int32,System.String]]' 类型 'System.Collections.Generic.List1[[<>f__AnonymousType172[[System.Int32, mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]], App_Web_rjb524gi,版本=0.0.0.0,文化=中性, 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();
}

【问题讨论】:

  • GridViewPlayers.DataSource = ViewState["CurrentGridView"]; 无法正确反序列化该类。一种选择是添加 class Player{public int PlayerId;public string PlayerName;} 并转换结果,例如GridViewPlayers.DataSource = (List&lt;Player&gt;) ViewState["CurrentGridView"];
  • 似乎 Session 工作,但我不希望会话对象在应用程序周围浮动,而是在页面更改时将其杀死。这样会更好吗?

标签: c# linq entity-framework gridview viewstate


【解决方案1】:

如果您真的想将它存储在 View State 中,那么您可能希望有一个可以标记为 [Serializable] 的类型。看起来匿名类型不是。所以不要使用:

var search

使用

 List<Player> search =  Query  

还有班级。

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

但是,看起来您每次都在查询数据库,所以即使您确实存储在视图状态中,您也不会获得任何东西。

【讨论】:

  • 在 ViewState (Uncaught Sys.WebForms.PageRequestManagerServerErrorException Error serializing value) 中存储值时遇到了同样的问题,而我的类定义被标记为可序列化。我可以从后面的代码中读取和写入值,但在客户端出现错误。
【解决方案2】:

问题是,您不能使用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 应该可以正常工作。

【讨论】:

  • 所以我认为使用 EF(实体框架)的目的是让开发人员不必制作模型类。
  • 如果您的实体已经创建了 Player 类,然后尝试将 ViewState['something'] 转换为 Player[] 和/或 List
  • 是的,这是 EF 为帮助开发人员而完成的任务之一,但您没有使用 EF 创建的类。相反,您正在创建一个anonymous type。如果您已经从 EF 创建了 Player 类,请使用它而不是 select new {...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多