如何序列化ASP.NET用户控件
我有一个带有GridView的应用程序,这个GridView在您的PagerTemplate中有一个GridViewPager,它是一个用户控件 现在,我正试图将这个GridViewPager存储在ViewState中,但序列化有问题。Asp.Net告诉我该类未标记为可序列化。我尝试将其标记为可序列化,如下所示:如何序列化ASP.NET用户控件,asp.net,gridview,user-controls,viewstate,serializable,Asp.net,Gridview,User Controls,Viewstate,Serializable,我有一个带有GridView的应用程序,这个GridView在您的PagerTemplate中有一个GridViewPager,它是一个用户控件 现在,我正试图将这个GridViewPager存储在ViewState中,但序列化有问题。Asp.Net告诉我该类未标记为可序列化。我尝试将其标记为可序列化,如下所示: namespace Avalon.View.UserControls.Pagers { [Serializable] public partial class Grid
namespace Avalon.View.UserControls.Pagers
{
[Serializable]
public partial class GridViewPager : System.Web.UI.UserControl
{
private GridView _gridView;
public event EventHandler OnTextPageChanged;
// Methods, properties...
}
}
但它不起作用
我的代码很简单,让我们看看:
// Get and set the GridViewPager to ViewState
public partial class ChamadoList : System.Web.UI.UserControl
{
// Here a Get and set my GridViewPager into ViewState
public GridViewPager gvp
{
get { return ((GridViewPager)ViewState["GridViewPager"]); }
set
{
if (value == null)
ViewState["GridViewPager"] = null;
else
ViewState["GridViewPager"] = value;
}
}
// Looping in a grid View i get the GridViewPager and put it on ViewState
protected void gvListaChamados_RowDataBound(object sender, GridViewRowEventArgs e)
{
// Here a get the pager
if (e.Row.RowType == DataControlRowType.Pager)
{
gvp = (GridViewPager)e.Row.FindControl("GridViewPager1");
}
}
//...
}
这里是错误
“/”应用程序中出现服务器错误。
程序集“App\u Web\u epwoiz7x,版本=0.0.0.0,区域性=中立,PublicKeyToken=null”中的类型“ASP.view\u usercontrols\u pagers\u gridviewpager\u ascx”未标记为可序列化。
描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源
异常详细信息:System.Runtime.Serialization.SerializationException:程序集“App\u Web\u epwoiz7x,版本=0.0.0.0,区域性=中性,PublicKeyToken=null”中的类型“ASP.view\u usercontrols\u pagers\u gridviewpager\u ascx”未标记为可序列化
源错误:
在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别
堆栈跟踪:
[序列化异常:程序集'App\u Web\u epwoiz7x,版本=0.0.0.0,区域性=中性,PublicKeyToken=null'中的类型'ASP.view\u usercontrols\u pagers\u gridviewpager\u ascx'未标记为可序列化。]
System.Runtime.Serialization.FormatterServices.InternalGetSerializationMembers(RuntimeType类型)+7733643
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext上下文)+258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()+111
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerializate(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfo初始化SeroObjectInfo初始化、FormatterConverter转换器、ObjectWriter ObjectWriter)+161
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serializate(对象obj、ISurrogateSelector代理选择器、StreamingContext上下文、SeroObjectInfo init SeroObjectInfo init、FormatterConverter转换器、ObjectWriter ObjectWriter)+51
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serializate(对象图,头[]inHeaders,u BinaryWriter serWriter,Boolean fCheck)+410
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialization(流序列化流,对象图,头[]头,布尔fCheck)+134
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialization(流序列化流,对象图)+13
System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter编写器,对象值)+845
[ArgumentException:序列化“ASP.view\U usercontrols\U pagers\U gridviewpager\U ascx”类型的值“ASP.view\U usercontrols\U pagers\U gridviewpager\U ascx”时出错。“]
System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter编写器,对象值)+3395
System.Web.UI.ObjectStateFormatter.Serialize(流输出流、对象状态图)+110
System.Web.UI.ObjectStateFormatter.Serialize(对象状态图)+57
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize(对象状态)+4
System.Web.UI.Util.SerializeWithAssert(IStateFormatter格式化程序,对象状态图)+37
System.Web.UI.HiddenFieldPageStatePersister.Save()+79
System.Web.UI.Page.SavePageStateToPersistenceMedium(对象状态)+105
System.Web.UI.Page.SaveAllState()+236
System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+1099
版本信息:Microsoft.NET Framework版本:2.0.50727.3082;ASP.NET版本:2.0.50727.4028为什么不让您的UserControl管理自己的ViewState,而不是尝试序列化自己
public partial class GridViewPager : System.Web.UI.UserControl
{
private int _startPage;
public int StartPage
{
get { return _startPage; }
set { _startPage = value; }
}
protected override void LoadViewState(object savedState)
{
object[] totalState = null;
if (savedState != null)
{
totalState = (object[])savedState;
if (totalState.Length == 2)
{
base.LoadViewState(totalState[0]);
// Load back your properties, etc. from ViewState
if (totalState[1] != null)
startPage = int.Parse(totalState[1]);
}
}
}
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object[] totalState = new object[2];
// Save out your properties, etc. to ViewState.
totalState[0] = baseState;
totalState[1] = _startPage;
return totalState;
}
}
这样,当用户控件添加到页面时,它将管理自己的ViewState。为什么不让用户控件管理自己的ViewState,而不是尝试序列化自己
public partial class GridViewPager : System.Web.UI.UserControl
{
private int _startPage;
public int StartPage
{
get { return _startPage; }
set { _startPage = value; }
}
protected override void LoadViewState(object savedState)
{
object[] totalState = null;
if (savedState != null)
{
totalState = (object[])savedState;
if (totalState.Length == 2)
{
base.LoadViewState(totalState[0]);
// Load back your properties, etc. from ViewState
if (totalState[1] != null)
startPage = int.Parse(totalState[1]);
}
}
}
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object[] totalState = new object[2];
// Save out your properties, etc. to ViewState.
totalState[0] = baseState;
totalState[1] = _startPage;
return totalState;
}
}
这样,当用户控件添加到页面时,它将管理自己的视图状态。我认为这不起作用。在我的案例中,我需要序列化我的UserControls如果我理解您的问题,您正在尝试将用户控件的viewstate保存在use控件中。如果是这样的话,那么如果您只是将一个usercontrol作为子控件添加到另一个usercontrol,那么这应该是可行的。这将不起作用。例如,像菜单这样的类可以有子菜单,这样菜单本身就是MenuItem的子类,MenuItem是UserControl。因为菜单需要保存它的菜单项,菜单项需要可序列化,而且菜单项可以是菜单,菜单本身需要可序列化。我认为这不起作用。在我的案例中,我需要序列化我的UserControls如果我理解您的问题,您正在尝试将用户控件的viewstate保存在use控件中。如果是这样的话,那么如果您只是将一个usercontrol作为子控件添加到另一个usercontrol,那么这应该是可行的。这将不起作用。例如,像菜单这样的类可以有子菜单,这样菜单本身就是MenuItem的子类,MenuItem是UserControl。因为菜单需要保存它的菜单项,所以菜单项需要是可序列化的,因为菜单项可以是菜单,所以菜单本身需要是可序列化的。