Как сериализовать ASP.NET UserControl - PullRequest
1 голос
/ 09 февраля 2010

У меня есть приложение с 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");
        }
    }

    //...
}

А вот и ошибка

Ошибка сервера в приложении '/'.

Тип «ASP.view_usercontrols_pagers_gridviewpager_ascx» в сборке «App_Web_epwoiz7x, версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null» не помечен как сериализуемый. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Runtime.Serialization.SerializationException: введите «ASP.view_usercontrols_pagers_gridviewpager_ascx» в сборке «App_Web_epwoiz7x, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = null» не помечена как сериализуемая.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[Исключение SerializationException: введите «ASP.view_usercontrols_pagers_gridviewpager_ascx» в сборке «App_Web_epwoiz7x, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = null» не помечена как сериализуемая.] 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 (Object obj, ISurrogateSelector surrogateSelector, контекст StreamingContext, SerObjectInfoInit serObjectInfoInit, преобразователь IFormatterConverter, ObjectWriter objectWriter) +161 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize (Object obj, ISurrogateSelector surrogateSelector, контекст StreamingContext, SerObjectInfoInit serObjectInfoInit, преобразователь IFormatterConverter, ObjectWriter objectWriter) +51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (Граф объектов, заголовок [] inHeaders, __BinaryWriter serWriter, логический fCheck) +410 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (поток serializationStream, граф объектов, заголовки [], логический fCheck) +134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (поток, сериализация, поток, граф объектов) +13 System.Web.UI.ObjectStateFormatter.SerializeValue (модуль записи SerializerBinaryWriter, значение объекта) + 845

[ArgumentException: Ошибка сериализации значения «ASP.view_usercontrols_pagers_gridviewpager_ascx» типа «ASP.view_usercontrols_pagers_gridviewpager_ascx.»] System.Web.UI.ObjectStateFormatter.SerializeValue (модуль записи SerializerBinaryWriter, значение объекта) +3395 System.Web.UI.ObjectStateFormatter.Serialize (Stream outputStream, Object stateGraph) +110 System.Web.UI.ObjectStateFormatter.Serialize (Object stateGraph) +57 System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize (состояние объекта) +4 System.Web.UI.Util.SerializeWithAssert (форматер IStateFormatter, объект StateGraph) +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

1 Ответ

1 голос
/ 09 февраля 2010

Почему бы не использовать 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.

...