none
DataPagerがある条件で無限再帰→スタックオーバーフロー RRS feed

  • 質問

  • ASP.NET 3.5 で開発しています。IIS6, 7, 7.5 で再現する現象で相談です。

    DataPagerを、QueryStringField="page" としてクエリ文字列でページを指定するモードで使用しています。
    そのDataPagerはListViewのLayoutTmeplateの中に置いています。

    表のデータ件数が0のとき、URLに ?page=1 を追加すると無限再帰が起こってスタックオーバーフローを起こしてしまうという現象が起きます。

    (データソースはObjectDataSourceでのみ確認。SelectCountMethodの有無にはかかわりません)

    • LayoutTemplateの中にDataPagerを置く
    • DataPagerはクエリ文字列でページを指定するモード(QueryStringField="page")
    • データ件数が0
    • URLに ?page=1
    で発生するので、DataPagerをListViewの外に出してしまえばいいのですが、これですとデータ件数が0の場合にもページャが表示されてしまい、開発意図とやや異なってしまいます。

    ListView#OnItemDataBound でページャのVisibleを制御でもしようかなどと考えているところですが
    1. これは既知のバグであったりするでしょうか?
    2. うまい回避方法をご存知でしたらご教示ください。

    • 編集済み miuras_net 2010年3月18日 7:37 脱字
    2010年3月18日 7:17

回答

  • > あれ、そうでしたっけ。

    自分が試した限りでは、件数 0 の場合は DataPager は表示されません。試して
    みてください。

    • 回答としてマーク miuras_net 2010年3月24日 6:27
    2010年3月22日 13:17

すべての返信

  • MSDN ライブラリの "DataPager.QueryStringField プロパティ" のサンプル
    コードを少しいじって試してみましたが、問題は再現できませんでした。

    環境は、IIS7 (Vista Ultimate の)、.NET 3.5 SP1 です。

    以前、以下のスレッドの問題で、回避策を取ったことは影響していませんか?

    DataPagerが少し不整形なクエリ文字列で例外を出してしまう
    http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/d36c2b5d-5280-452e-8215-590431570d87

    ページ設定するのに QueryStringField を使うのはあきらめて、以下のページ
    を参考にページ指定することはできませんか?

    Resetting the Page Index in a ListView
    http://leedumond.com/blog/resetting-the-page-index-in-a-listview/

    2010年3月18日 14:16
  • 再現しませんでしたか。

    それでは再現用の簡単なコードを。(再現用コードを書いていてわかったのですが、EmpatyDataTemplateも必須のようです)

    以前の相談の件を覚えていらっしゃってうれしいのですが、これの対策を取り除いてもやはり出ますね…

     

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
        <asp:ObjectDataSource runat="server" ID="DS" TypeName="System.Collections.ArrayList" SelectMethod="Repeat">
            <SelectParameters>
                <asp:Parameter Name="value" DefaultValue="string" />
                <asp:Parameter Name="count" DefaultValue="0" />
            </SelectParameters>
        </asp:ObjectDataSource>
        
        <asp:ListView runat="server" DataSourceID="DS">
            <LayoutTemplate>
                <ul><li runat="server" id="itemPlaceHolder" /></ul>
                <asp:DataPager runat="server" QueryStringField="page">
                    <Fields>
                        <asp:NumericPagerField />
                    </Fields>
                </asp:DataPager>
            </LayoutTemplate>
           
            <ItemTemplate>
                <li>
                    <%# Container.DataItem %>
                </li>
            </ItemTemplate>
            
            <EmptyDataTemplate>
                No Data
            </EmptyDataTemplate>
        </asp:ListView>
        
        </div>
        </form>
    </body>
    </html>

     

     

    ArrayList.Repeatに count=0 を与えているので0件のデータソースです。

    これに Default.aspx?page=1 と与えて呼び出すと発症します。

    • 編集済み miuras_net 2010年3月19日 3:01 不要部分を削る
    2010年3月19日 2:43
  • QueryStringFieldを使うのをあきらめる件については、つまらないこだわりかもしれませんが、NumericPagerFieldがリンクボタンになってしまうのが不満なので避けたいと思っています。

    Javascript無効でも問題なく使えるようにサイト全体を設計しているので、こんなところでJS依存の部分が生まれてしまうのがどうにも・・・

    2010年3月19日 3:00
  • 先に書いた「MSDN ライブラリの "DataPager.QueryStringField プロパティ" の
    サンプルコードを少しいじって・・・」のコードに EmptyDataTemplate を追加
    したら再現しました。

    最初の質問にあった4つの条件に加えて、EmptyDataTemplate があると問題が起
    こるようです。

    ただし、

    > DataPagerをListViewの外に出してしまえばいいのですが、これですとデータ
    > 件数が0の場合にもページャが表示されてしまい、開発意図とやや異なってし
    > まいます。

    とのことですが、件数 0 の場合は、ListView の外にページャーを配置しても、
    それが表示されることはないですけど?

    2010年3月19日 13:40
  • > 件数 0 の場合は、ListView の外にページャーを配置しても、
    > それが表示されることはないですけど?

     

    あれ、そうでしたっけ。

    これは失礼しました。それだったら…出してPagedControlIDを設定するだけでおわりでしたね。

    2010年3月22日 2:23
  • > あれ、そうでしたっけ。

    自分が試した限りでは、件数 0 の場合は DataPager は表示されません。試して
    みてください。

    • 回答としてマーク miuras_net 2010年3月24日 6:27
    2010年3月22日 13:17