0

ですから、私は、ページのライフサイクル/ビューステートの問題に苦労しています。3つのListViewコントロールをホストするページがあります。常に1つだけが表示されます。単一のDataPagerを使用して、DataPagerのPagedControlIDを表示されているListViewのIDにプログラムで割り当てたいと思います。DataPagerは、主にDataPagerへの単なるパススルーであるユーザー定義ユーザーコントロール(ASCX)に含まれていることを指摘するのが適切かもしれません。

エラーは十分に単純なようです...

[InvalidOperationException: No IPageableItemContainer was found. Verify that either the DataPager is inside an IPageableItemContainer or PagedControlID is set to the control ID of an IPageableItemContainer.]
System.Web.UI.WebControls.DataPager.LoadControlState(Object savedState) +628838
   System.Web.UI.Control.LoadControlStateInternal(Object savedStateObj) +137
   System.Web.UI.Page.LoadAllState() +342
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2533

これが現在の一連のイベントです。

  1. ListViewが表示される「詳細」ページにリンクする「概要」ページがあります。

  2. 「SUMMARY」ページのリンクをクリックすると、コントロールが「DETAIL」ページに転送され(リダイレクトされません)、「SUMMARY」ページのプロパティをPage.PreviousPageプロパティを介して「DETAIL」に転送できます。ページ。

  3. ターゲットの「DETAIL」ページのOnInitCompleteイベントで、「PreviousPage」のプロパティ値を新しい「DETAIL」ページのプロパティに割り当てます。

    protected override void OnInitComplete(EventArgs e)
    {
        IExceptionPage previousPage = (PreviousPage != null) ? ((IExceptionPage)PreviousPage) : null;
        if (previousPage != null)
        {
            this.ActiveListID       = previousPage.ActiveListID;
            this.ActionType         = previousPage.ActionType;
            this.CategoryTheme      = previousPage.CategoryTheme;
            this.ExceptionCode      = previousPage.ExceptionCode;
        }
    }
    
  4. これらの「DETAIL」ページのプロパティは単にViewStateに対して読み取りと書き込みを行うため、OnInitCompleteイベントでこれらのプロパティに値を割り当てることにより、これらの値がこのページの将来のポストバック間で保持されることを期待しています。これらのプロパティの1つは、DataPagerをバインドするListViewのIDです。

    public String ActiveListID
    {
        get { return (String)ViewState["ActiveListID"]; }
        set { ViewState["ActiveListID"] = value; }
    }
    
  5. ここで、OnPreLoadイベントで、DataPagerコントロールのPagedControlIDプロパティを、ViewState属性に格納されているListViewのIDに設定しました。

  6. ページの初期読み込みは問題なく進行します。

  7. この問題は、ページに投稿するようなことをしようとすると発生します。OnInitCompleteイベントハンドラーとOnPreLoadイベントハンドラーの間で、「InvalidOperationException」エラーがスローされます。

エラーを見ると、PagerのPagedControlIDプロパティが正しく設定されていないようです。私が理解していないのはその理由です。

  1. ポケットベルは、以前に設定されたPagedControlIDを覚えておくべきではありませんか?ポケットベル独自のViewStateに保存されていませんか?

  2. そうでない場合、ViewStateトラッキングがオンになっているOnPreLoadの前にエラーがスローされるのはなぜですか(これは、OnLoadイベントで設定されているMicrosoftのMSDNの例と矛盾しています)。

  3. OnInitイベントでPreLoadイベントの前にPagedControlIDを設定しようとしましたが、最初にロードされたページがViewStateに存在しなくなったため、NULL値が返されるという問題が発生しました。また、IDがViewStateに保存されない理由もわかりません。私が参照しているMSDNのドキュメントによると、OnInitCompleteイベントで設定すると、追跡されるViewState値に含める必要があります。

誰かがこれについて何か考えを持っているなら、私は最も感謝するでしょう。

ありがとう、G

4

1 に答える 1

1

スタックトレースに基づいて、ビューステートがロードされる前に呼び出されるInvalidOperationException中にスローされます。(.ascxで)宣言的に設定しない場合でも、ページのライフサイクルのこの時点では空の文字列のままになります。LoadControlStatePagedControlID

DataPagerMSDNライブラリの例は、1つの重要な点でコードとは異なります。動的に構築され、初期化され、ページに追加されます。LoadControlStateがページに追加されるまで呼び出されません。DataPagerこの時点で、PagedControlIDはすでに初期化されています。

PagedControlIDASP.NETチームが、動的に設定されるプロパティをサポートすることを実際に意図していたようには見えません。試すことができるのは、MSDNライブラリの例をエミュレートしてDataPager動的に追加することだけだと思います。

于 2013-01-12T04:59:43.880 に答える