1

私は GridView を持つアプリケーションを持っています。この GridView は、PagerTemplate に、UserControl である GridViewPager を持っています。

今、この 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、Version=0.0.0.0、Culture=neutral、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' の Type 'ASP.view_usercontrols_pagers_gridviewpager_ascx' は、シリアル化可能としてマークされていません。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[SerializationException: Type 'ASP.view_usercontrols_pagers_gridviewpager_ascx' in Assembly 'App_Web_epwoiz7x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +7733643 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type 型、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 context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, 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(ストリームのシリアル化ストリーム、オブジェクト グラフ、Header[] ヘッダー、ブール値の fCheck) +134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(ストリームのシリアル化ストリーム、オブジェクトグラフ) +13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter ライター、オブジェクト値) +845ObjectWriter 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(Stream serializationStream, Object graph) +13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer,オブジェクト値) +845ObjectWriter 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(Stream serializationStream, Object graph) +13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter writer,オブジェクト値) +845オブジェクト グラフ、Header[] ヘッダー、ブール値 fCheck) +134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(ストリーム serializationStream、オブジェクト グラフ) +13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter ライター、オブジェクト値) +845オブジェクト グラフ、Header[] ヘッダー、ブール値 fCheck) +134 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(ストリーム serializationStream、オブジェクト グラフ) +13 System.Web.UI.ObjectStateFormatter.SerializeValue(SerializerBinaryWriter ライター、オブジェクト値) +845

[ArgumentException: タイプ 'ASP.view_usercontrols_pagers_gridviewpager_ascx' の値 'ASP.view_usercontrols_pagers_gridviewpager_ascx' のシリアル化エラー] 、オブジェクト stateGraph) +110 System.Web.UI.ObjectStateFormatter.Serialize(オブジェクト状態グラフ) +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

4

1 に答える 1

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 が管理されます。

于 2010-02-09T16:05:36.907 に答える