質問者
GridVewをUpdatePanel上に配置し、GridView上のボタンをクリックすると、例外発生

質問
-
GridViewをUpdatePanel上に配置し、
GridViewにはテキストとボタン、チェックボックスを配置しています
UpdatePanelのプロパティを
ChildrenAsTrrigers=false;
UpdateMode=Condirional;
ValidateRequestMode=Disabled;
ViewStateMode=Disabled;
としています
クライアント上のスクリプトで、その行に対して着色、非着色などをしています
なのですが、グリッド上のボタンをクリックすると、
「Sys.WebForms.PageRequestManagerServerErrorException: このページの状態情報は無効です。破損している可能性があります。」
という例外が発生します
http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/73fd3ea9-defc-45fc-bce8-3ab4a9160c29/
を参考にしてみたのですが、
グリッド上にテキストボックスなどの入力欄があるわけではなく、
なぜ例外が発生するのかもわからないです上記のリンクのInitializeRequest関数を、
// 非同期ポストバックの初期化(initializeRequest)イベントハンドラ
function InitializeRequest(sender, args)
{
args.set_cancel(true);
}
としてしまえば、ポストバックそのものが発生しなくなるのでエラーは発生しなくなるのですが、さすがにポストバックが発生しないのは
考え物で、何か回避方法を探していますScriptManagerにポストバックエラーをキャッチするというのもやってみたのですが・・・
//csファイル
protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
//string strErr = e.Exception.Message;
ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message;
}//global.asaxファイル
void Application_Error(object sender, EventArgs e)
{
// ハンドルされていないエラーが発生したときに実行するコードです
//ログいろいろ
Server.ClearError(); //追加
}としてみたのですが、この後に例外が発生してしまいます
ボタンを押されたときに、勝手にクライアントで着色したところを変えられたくないので
UpdatePanelを書き換えないようにしたのですが、
このようなエラーの回避方法はないでしょうか(何も画面の書き換えをしなくても、ボタンをクリックしていると例外が発生してしまうのですが、ポストバックにゴミは乗ってしまうのでしょうか)
すべての返信
-
エラーメッセージを見る限り、ViewState が壊れたような感じですが、質問にある情報だけではとても原因はわかりません。PageRequestManagerServerErrorException とエラーメッセージの英文 "The state
information is invalid for this page and might be corrupted." でググって見るといろいろ出てきますが、ワンパターンではないようです。という訳で、ご自分で問題を再現できる必要最小限にコードを削っていくなどして原因を調べるほかないと思います。コードを削る段階で原因がわかって自己解決できるかもしれません。
自己解決できなくても、コピペすれば動くコードをアップすれば、回答者のほうでも検証できるので、もう少しましな回答が期待できるかも。
ただ、質問のコードをみると ASP.NET 4.5 のようなので、試せる人は限られていると思いますが(自分はダメです)。
-
状態情報が無効、ということなので SurferOnWwwさんがおっしゃるようにViewState関係のように思えますが。
クライアント側のスクリプトでどんなことをしてます?
特に「UpdatePanelを書き換えないようにしたのですが」という一文が気になっています。サーバ側は送り出す前の情報をViewStateに含めており、リクエストがあがってきたときにViewState内の情報とあがってきたリクエストの内容を確認することでイベントを発生させる等の処理を行います。
クライアント側のスクリプトで状態を変更していることにより、元の(ViewStateに含まれている)状態とあがってきたリクエストの整合性が(サーバ側からみると)とれなくなっており、そのため「状態情報が無効」と判断されてしまっている可能性があるのではないかと思います。
あおい情報システム株式会社 小野修司(どっとねっとふぁん)
- 編集済み 小野@どっとねっとふぁん 2012年12月17日 12:50