【问题标题】:How to Serialize a ASP.NET UserControl如何序列化 ASP.NET 用户控件
【发布时间】:2011-01-14 20:03:24
【问题描述】:

我有一个带有 GridView 的应用程序,这个 GridView 在您的 PagerTemplate 中有一个 GridViewPager,它是一个 UserControl。

现在我正在尝试将此 GridViewPager 存储在 ViewState 中,但我遇到了序列化问题。 Asp.Net 告诉我该类未标记为可序列化。我尝试将其标记为可序列化,如下所示:

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_Web_epwoiz7x,版本=0.0.0.0,文化=中性,PublicKeyToken=null”中的类型“ASP.view_usercontrols_pagers_gridviewpager_ascx”未标记为可序列化。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Runtime.Serialization.SerializationException:在程序集“App_Web_epwoiz7x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中键入“ASP.view_usercontrols_pagers_gridviewpager_ascx”未标记为可序列化。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[SerializationException:在程序集“App_Web_epwoiz7x,版本=0.0.0.0,文化=中性,PublicKeyToken=null”中的类型“ASP.view_usercontrols_pagers_gridviewpager_ascx”未标记为可序列化。] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型) +7733643 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext 上下文)+258 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter)+161 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter)+51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +410 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流序列化流,对象图)+13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value) +845

[ArgumentException:错误序列化“ASP.view_usercontrols_pagers_gridviewpager_ascx”类型的值“ASP.view_usercontrols_pagers_gridviewpager_ascx”。] System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer, Object value) +3395 System.Web.UI.ObjectStateFormatter.Serialize(Stream outputStream, Object stateGraph) +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(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1099


版本信息:Microsoft .NET Framework 版本:2.0.50727.3082; ASP.NET 版本:2.0.50727.4028

【问题讨论】:

    标签: asp.net gridview user-controls viewstate serializable


    【解决方案1】:

    为什么不让您的 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;
        }
    } 
    

    这样,当您的 UserControl 添加到页面时,它将管理自己的 ViewSate。

    【讨论】:

    • 我认为这行不通。我的情况是我需要序列化我的 UserControl
    • 如果我理解您的问题,您正在尝试将用户控件的视图状态保存在使用控件中。如果是这样,那么如果您只是将一个用户控件作为子控件添加到另一个用户控件,那么这应该可以工作。
    • 这行不通。例如,像Menu 这样的类可以有子菜单,这样Menu 本身就是MenuItem 的子类,MenuItem 是UserControl。由于 Menu 需要保存它的菜单项,所以菜单项需要可序列化,并且由于菜单项可以是 Menu,Menu 本身也需要可序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2013-03-31
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多