none
Sys.WebForms.PageRequestManagerServerErrorException:...500 RRS feed

  • 質問

  • お世話になります。

    ASP.net で検索フォームを作成していて、エラーで行き詰ってしまったので質問させていただきます。

    やっていることは、
    ・検索フォームに条件を入力し、ボタンクリックで検索
     ↓
    ・条件に一致するデータがあったら表示(UpdatePanel使用)
    ・条件にあったデータがない場合は「データがありません」と表示(UpdatePanel使用、上のとは別のもの)
    といった感じです。
    データの表示は、PlaceHolderとLiteralを使ってタグごと出力しています。(以下例)
    ---------
       Literal lit = new Literal();
       lit.Text = "<div class=test>てすと</div>";
       PlaceHolder1.Controls.Add(lit);
    ---------
    (手打ちなので間違ってたらすみません・・・)

    ここまでは問題なかったのですが、入力した条件をクリアするために
    <input type="reset" value="クリア">
    と、付け加えました。

    この状態で、
    検索→ヒットしたデータを表示→クリア
    とした後に、検索ボタンを再度クリックするとIEでは以下のエラーがアラートで出ました。

    ---------------------------------
    Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was: 500
    ---------------------------------

    Firefoxだと問題なく動いています。
    いろいろ調べてみると、データを表示する時にタグが含まれていることが原因になっているようでした。
    validateRequest = False にはしていません。


    なぜ、最初は問題なかったタグを含む文字列の出力が、
    クリアボタンを押した後だと問題になるのかがまったく分かりません。

    ご存知の方がいらっしゃいましたら、ご教授ください。
    よろしくお願い致します。
    2008年5月8日 7:57

回答

  • 試してみたわけでもなく、完全に推測なのですが、<input type=reset> の使用は危険だと思います。
     
    このボタンを使用すると、Web ブラウザは対象の form の要素を一時的に記録されている状態へ戻そうとします。多くのブラウザは、ページ全体の読み込みが発生した時点の情報に戻しますが、ASP.NET では、<input type=hidden> のフィールドにコントロールの状態などを保持していたりいます。
     
    1例としては、ViewState や ControlState と呼ばれる要素が <input type=hidden> のタグに格納されており、Microsoft Ajax で UpdatePanel などを使用した Async Request を実施すると、ViewState などの値を更新する機能も備えています。このため、Async Request が発生した後で <input type=reset> のボタンが押されると、ASP.NET 側のフレームワークが期待する状態と、Web ブラウザが保持している ViewState の状態に矛盾が発生することが予測されます。
     
    このような理由から、<input type=reset> ではなく、いくつかのフィールドを初期値に戻すような実装を持った <input type=button> や <asp:Button> を使用されることをおすすめしたいです。
     
     
    2008年5月9日 4:18

すべての返信

  • 試してみたわけでもなく、完全に推測なのですが、<input type=reset> の使用は危険だと思います。
     
    このボタンを使用すると、Web ブラウザは対象の form の要素を一時的に記録されている状態へ戻そうとします。多くのブラウザは、ページ全体の読み込みが発生した時点の情報に戻しますが、ASP.NET では、<input type=hidden> のフィールドにコントロールの状態などを保持していたりいます。
     
    1例としては、ViewState や ControlState と呼ばれる要素が <input type=hidden> のタグに格納されており、Microsoft Ajax で UpdatePanel などを使用した Async Request を実施すると、ViewState などの値を更新する機能も備えています。このため、Async Request が発生した後で <input type=reset> のボタンが押されると、ASP.NET 側のフレームワークが期待する状態と、Web ブラウザが保持している ViewState の状態に矛盾が発生することが予測されます。
     
    このような理由から、<input type=reset> ではなく、いくつかのフィールドを初期値に戻すような実装を持った <input type=button> や <asp:Button> を使用されることをおすすめしたいです。
     
     
    2008年5月9日 4:18
  • K.Takaoka さん、ありがとうございます。

    返信が遅くなって申し訳ございません。

     

    >ASP.NET では、<input type=hidden> のフィールドにコントロールの状態などを保持していたりいます。

    確かにASP.NETで生成されたコードを見てみると、至る所に<input type=hidden>がありますね。

    <input type=button> か <asp:Button> の使用を検討いたします。

     

    ありがとうございました。
    2008年5月10日 0:13