- 題名: 「無効なポストバックまたはコールバック引数です」について
- 日時: 2011/11/25 9:57:25
- ID: 29391
- この記事の返信元:
- (なし)
- この記事への返信:
- [29392] Re[1]: 「無効なポストバックまたはコールバック引数です」について2011/11/25 10:59:19
- ツリーを表示
2011/11/26(Sat) 13:04:15 編集(投稿者) ■No29393に返信(Hiroさんの記事) テキストボックスの値やドロップダウンリストでどれが選択されているか、 チェックボックスリストでどれが選択されているかなどは、クライアント側で変更さ れることが予測されます。一方テキストボックスのname属性やドロップダウンリスト の項目そのもの、チェックボックスリストの項目そのものなどは、クライアント側で 変更されないはずで、変更されないことが期待されます。変更されるべきでないもの が変更されてクライアントからサーバーに送られたばあいに、サーバー側でのイベン トが発生する前の段階で、情報の不整合を検出して、処理を中断する仕組みがありま す。それが無効なポストバックまたはコールバック引数です、という例外と関わりが あります。 クライアント --> サーバー ページを表示するときに1回目のリクエストがクライアントからサーバーに送られま す。 クライアント <-- サーバー それに対応するレスポンスがサーバーからクライアントに送られてページがブラウザ に表示されます。このときにサーバーからクライアントに送られるレスポンスに変更 されるべきでないコントロールの情報が含まれます。 クライアント --> サーバー ページがサブミットされると、2回目のリクエストがクライアントからサーバーに送 られます。このときに1回目のレスポンスで送られてきた変更されるべきでない コントロールの情報もサーバーに送られます。1回目のレスポンスでサーバーからク ライアントに送られた、変更されるべきでないコントロールの情報と、サブミットさ れてきたコントロールの情報が整合するか、サーバー側で確認されます。整合すれば サーバー側でのイベントが発生します。不整合であれば件の例外が発生します。 変更されるべきでないコントロールの情報はinput type="hidden"の隠し項目として ページに含まれます。name属性は__EVENTVALIDATIONです。ブラウザでソースを表示 すれば見ることができます。 __EVENTVALIDATIONに格納される、変更されるべきでないコントロールの情報は サーバー側でコントロールの情報はこれだ、ということで認識されたもの、 「ASPが認識しているそのページ」のことです。2回目以降のリクエストでサブミット されるコントロールの情報は「実際のSubmitデータ」のことです。2つの情報が整合 するか否かは差分のことです。 例外が発生する原因としては、__EVENTVALIDATIONのname属性をもつ隠し項目が ページに配置される前に2回目のリクエストが送られた、クライアント側で JavaScriptを使ってサーバーコントロールが変えられた、といったことが考え られます。例外発生時のスタックトレースにはどのように出力されていますか? ポストバックするけれども変化がないというのは、例外が出ることに変化が無いとい うことですか?それとも、例外は出なくなるけれども、期待する動作が行われないと いうことですか?例外は出なくなるけれども期待する動作が行われない、ということ であれば、GridView.RowCommandイベントのハンドラであるGridView1_RowCommand メソッドにブレークポイントを仕掛けて処理に入るかどうかを確認して、もし処理に 入らなければ、イベントとイベントハンドラが関連付けられているか確認してみてく ださい。
■No29395に返信(Hiroさんの記事) ページに変化が無いということと、エラーが表示されるということがつながらないよ うに思えるのですが、「無効なポストバックまたはコールバック引数です」という例 外が投げられたときには、当該例外が発生したというページに遷移するはずだと思い ますが、その遷移はないということですか? ちょっと状況を整理させていただきたいのですが、GridViewのボタンを押下すると、 「無効なポストバックまたはコールバック引数です」という例外が発生する。それを 回避するために、ページディレクティブにEnableEventValidation="False"を追加す る。そして、GridViewのボタンを押下すると、ページに変化は無く、エラーが表示さ れる。ということですよね。 EnableEventValidation="False"をページディレクティブに追加して、GridViewのボ タンを押下して、GridView.RowCommandイベントのハンドラが呼ばれる前に発生する エラーというのは、「無効なポストバックまたはコールバック引数です」という例外 と同一のものですか? GridViewに選択ボタンがあって、GridView.SelectedIndexChangedイベントとそのハ ンドラが関連付けられているということですか。選択ボタンを押下して、問題なく呼 ばれるというのはGridView.SelectedIndexChangedイベントのハンドラが問題なく呼 ばれるということですか?それともGridView.RowCommandイベントのハンドラが問題 なく呼ばれるということですか?選択ボタンを押下したときには両方のイベントが発 生すると思いますが、両方のハンドラは問題なく呼ばれますか?
■No29397に返信(Hiroさんの記事) えっと、エラーが発生するのかしないのかよくわからなくなってきました。 EnableEventValidation="False"をページディレクティブに追加するとエラーは発生 せず、追加しなければ発生するということでよいですよね。 EnableEventValidation="False"はイベントの検証を行わないというものであり、 イベントを発生させないというものではありませんで、エラーが出ないことに よってイベントハンドラが呼ばれないわけではないでしょうから、なのでという接続 は違うと思いますが、イベントとイベントハンドラが関連付けられていて、イベント ハンドラが呼ばれないということは、イベントハンドラの関連付けられたオブジェク トが、別のオブジェクトに置き換えられている可能性があるということですかね。 Page.Loadイベントで無条件にGridView.DataBindメソッドを呼んで、 GridView.RowCreatedイベントが2回発生するようにしたところ、類似した現象を確認 できました。記述されているコードを丸ごと教えてもらえないでしょうか。
分類:[ASP.NET]
お世話になっております。
今まで、動作していた(開発中ですが)Webアプリがある時から下記のエラーでて動かなくなりました。
エラー全文
「無効なポストバックまたはコールバック引数です。イベントの検証は、構成の <pages enableEventValidation="true"/>、またはページの <%@ Page EnableEventValidation="true" %> を使用して有効にされます。セキュリティの目的により、この機能は、イベントをポストバックまたはコールバックする引数が、それらを最初に表示したサーバー コントロールから発行されていることを確認します。データが有効であり、予期されている場合、検証のためのポストバックまたはコールバック データを登録するために ClientScriptManager.RegisterForEventValidation メソッドを使用してください。」
このため、マスターページ使用の子に enableEventValidation="false" を追加して
<%@ Page Title="ホーム ページ" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" enableEventValidation="false" CodeBehind="Default.aspx.cs" Inherits="ReportForm._Default" %>
実行してみましたが、見掛け上、ポストバックしていますが、変化ありません。
期待の動作として、GridView内のボタンをしたら別ページを呼び出す(別ウインドウで)単純なもの。
下記にそのコードです。
GridView 内の項目のチェックボックスをテンプレートフィールドにして
<asp:TemplateField HeaderText="履歴" SortExpression="KanjaHistory">
<EditItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server"
Checked='<%# Bind("KanjaHistory") %>' />
</EditItemTemplate>
<ItemTemplate>
<asp:Button ID="Button1" runat="server" CausesValidation="False" Text="表示"
CommandName="KanjaHistory" CommandArgument="<%# ((GridViewRow) Container).RowIndex%>"
Visible='<%# (bool)Eval("KanjaHistory") %>' />
</ItemTemplate>
</asp:TemplateField>
で、サーバ側の処理....ですが、実際下記が呼び出される前にエラーが出るのでクライアント側の問題だと思う。
// 履歴ボタンを押した(テンプレートに追加したボタンは、下記で処理する)
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "KanjaHistory")
{
// Retrieve the row index stored in the
// CommandArgument property.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button
// from the Rows collection.
GridViewRow row = GridView1.Rows[index];
:
:
ググってみると、enableEventValidation="false" この文を追加すればセキュリティは甘くなるけど解決するとのことが書いてありますが、私のアプリでは、動きません。
なぜこうなったかを考えて見ましたが、思い当たる節はGridViewの「データソースの構成」を行った後、表示される「’GridView1’のフィールドとキーを最新の情報に更新します。......」
で、「いいえ」を押したぐらい。その後、上記のため、やり直して「はい」にしたけど変わらず。
以上、長文で申し訳ありませんが。ご教示ください。