243

クライアント側からページをポストバックすると、次のエラーが発生します。クライアント側で asp:ListBox を変更する JavaScript コードがあります。

どうすればこれを修正できますか?

以下のエラーの詳細:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433
4

40 に答える 40

189

Page_Load イベントにコードはありますか? もしそうなら、おそらく以下を追加すると役立つでしょう。

if (!Page.IsPostBack)
{ //do something }

このエラーは、コマンドをクリックして Page_load が再度実行されたときにスローされます。通常のライフ サイクルでは、Page_Load -> コマンドのクリック -> Page_Load (再度) -> Process ItemCommand イベントです。

于 2010-09-21T09:30:42.230 に答える
176

問題は、ASP.NET がこの追加または削除された listitem を認識しないことです。いくつかのオプションがあります (以下にリストされています)。

  • eventvalidation を無効にします (コストがほとんどかからずにセキュリティが少し失われるため、悪い考えです)。
  • ASP.NET Ajax UpdatePanel を使用します。(リストボックスを追加または削除する場合は、リストボックスを Updatepanel に配置し、更新をトリガーします。このようにして、viewstate と関連フィールドが更新され、イベント検証が渡されます。)
  • クライアント側を忘れて、従来のポストバックを使用し、リスト項目をサーバー側で追加または削除します。

これが役立つことを願っています。

于 2008-10-23T09:03:28.427 に答える
40

DataGridを使った経験があります。その列の1つは「選択」ボタンでした。任意の行の[選択]ボタンをクリックすると、次のエラーメッセージが表示されました。

"無効なポストバックまたはコールバック引数。イベント検証は、構成またはページ内の<%@ Page EnableEventValidation = "true"%>を使用して有効になります。セキュリティ上の理由から、この機能は、ポストバックまたはコールバックイベントへの引数がサーバーコントロールから発信されていることを確認します。データが有効で期待される場合は、ClientScriptManager.RegisterForEventValidationメソッドを使用して、検証のためにポストバックまたはコールバックデータを登録します。」

いくつかのコードを変更し、ついに成功しました。私の経験ルート:

1)ページ属性をに変更しましたEnableEventValidation="false"しかし、それはうまくいきませんでした。 (これはセキュリティ上の理由から危険であるだけでなく、私のイベントハンドラーは呼び出されませんでした:void Grid_SelectedIndexChanged(object sender, EventArgs e)

ClientScript.RegisterForEventValidation2) Renderメソッドで実装しました。しかし、それはうまくいきませんでした。

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3)グリッド列のボタンタイプをからに変更しPushButtonましたLinkButton機能した!("ButtonType =" LinkBut​​ton ")。他の場合に" LinkBut​​ton "のような他のコントロールにボタンを変更できれば、正しく機能すると思います。

于 2008-11-09T07:57:56.263 に答える
28

イベントの検証を無効にしないでください。

asp:listbox クライアント側に項目を追加する際には、主に 2 つの問題があります。

  • 1 つ目は、イベントの検証に干渉することです。サーバーに戻ってきたものは、送信したものではありません。

  • 2 つ目は、イベントの検証を無効にしても、ページがポストバックされると、リストボックス内のアイテムがビューステートから再構築されるため、クライアントで行った変更が失われることです。この理由は、asp.net はリストボックスの内容がクライアントで変更されることを想定しておらず、選択が行われることのみを想定しているため、行った可能性のある変更を破棄するためです。

最適なオプションは、推奨されている更新パネルを使用する可能性が最も高いです。このクライアント側で本当に必要な場合の別のオプションは、 の<select>代わりにプレーンな古いものを使用し<asp:ListBox>、アイテムのリストを非表示フィールドに保持することです。ページがクライアントでレンダリングされると、テキスト フィールドのコンテンツの分割からデータを取り込むことができます。

次に、投稿する準備ができたら、変更した から非表示フィールドの内容を再入力します<select>。次に、もちろん、サーバー上でそれを再度分割し、アイテムで何かを行う必要があります。これは、選択がサーバーに戻ったので空になっているためです。

全体として、これは非常に面倒なソリューションであり、あまりお勧めしませんが、クライアント側で listBox を変更する必要がある場合は、うまくいきます。ただし、このルートに進む前に updatePanel を調べることを強くお勧めします。

于 2008-10-29T01:35:13.610 に答える
19

上記のどれも私にとってはうまくいきませんでした。さらに掘り下げた後、問題の原因となっているページに適用された2つのフォームを見落としていたことに気付きました。

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

最近、ASP.NET は、フォーム タグ内の iframe を、iframe ドキュメント自体にネストされたフレームと見なすようになったことに注意してください。このエラーを回避するには、フォーム タグから iframe を移動する必要がありました。

于 2016-04-19T16:39:49.527 に答える
16

EnableEventValidationがオンになっているWebサイトにRepeaterコントロールのあるWebページがあったため、Repeaterでも同じ問題が発生しました。良くありませんでした。無効なポストバック関連の例外が発生していました。

私にとってうまくいったのは、リピーターにEnableViewState="false"を設定することでした。利点は、WebサイトまたはWebページのイベント検証をオフに切り替えるのと同じくらい簡単に使用できることですが、スコープはどちらの場合もイベント検証をオフに切り替えるよりもはるかに小さくなります。

于 2009-11-19T12:25:25.553 に答える
13

クライアントで JavaScript を使用して ListBox を変更すると、同じ問題が発生しました。ページがレンダリングされたときにそこになかった新しい項目をクライアントから ListBox に追加すると発生します。

私が見つけた修正は、クライアントから追加できるすべての有効なアイテムをイベント検証システムに通知することです。これを行うには、Page.Render をオーバーライドし、JavaScript がリスト ボックスに追加できる値ごとに Page.ClientScript.RegisterForEventValidation を呼び出します。

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

リスト ボックスに有効な可能性のある値が多数ある場合、これはちょっと面倒です。私の場合、2 つの ListBox 間で項目を移動していました。1 つは可能なすべての値を持ち、もう 1 つは最初は空ですが、ユーザーがボタンをクリックすると JavaScript の最初の値のサブセットが入力されます。この場合、最初の ListBox の項目を反復処理し、それぞれを 2 番目のリスト ボックスに登録するだけです。

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}
于 2011-10-13T06:25:29.507 に答える
9

ここで言及されていないもう 1 つの方法は、ListBox をサブクラス化することです。

すなわち。

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation は、属性 System.Web.UI.SupportsEventValidation をサブクラス化する場合にキーをオフにします。明示的に追加し直さない限り、検証ルーチンが呼び出されることはありません。これはどのコントロールでも機能し、コントロールごとに(つまり、ページレベルではなく)「無効にする」ことがわかった唯一の方法です。

于 2011-02-28T15:56:41.163 に答える
8

クライアント側のスクリプトを使用して DropdownList に入力する場合は、フォームをサーバーに送信する前にリストをクリアします。その後、ASP.NET は文句を言わず、セキュリティは引き続きオンになります。

また、DDL から選択されたデータを取得するには、「OnChange」イベントを DDL にアタッチして、非表示の入力または Style="display: none;" のテキスト ボックスで値を収集できます。

于 2008-12-11T20:43:00.507 に答える
7

3: グリッド列のボタン タイプを「PushButton」から「LinkBut​​ton」に変更しました。出来た!("ButtonType="LinkBut​​ton") 他の場合は "LinkBut​​ton" のようにボタンを別のコントロールに変更できると、適切に機能すると思います。

私はあなたに投票できたらいいのに、アミール (悲しいかな、私の担当者は低すぎる.) 私はちょうどこの問題を抱えていて、これを変更すると私のグリッドビューのチャンピオンのように機能しました. 少し余談ですが、有効なコードは次のとおりだと思います: ButtonType="Link"

これは、[編集] をクリックすると、編集が [更新] と [キャンセル] に変更され、送信時に [編集] に戻るためだと思われます。そして、これらのシフト コントロールは .net を不安にさせます。

于 2009-02-19T00:39:34.150 に答える
7

(1) EnableEventValidation="false" ............うまくいきません。

(2) ClientScript.RegisterForEventValidation....うまくいきません。

解決策 1:

GridView で Button/ImageButton を LinkBut​​ton に変更します。できます。(でもImageButtonは好きです)

調査: Button/ImageButton と LinkBut​​ton はポストバックに異なる方法を使用します

原著:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

解決策 2:

OnInit() に、次のようなコードを入力して、 Button/ImageButton の一意の ID を設定します。

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

原著:

http://www.c-sharpcorner.com/Forums/Thread/35301/

于 2013-03-30T02:58:11.807 に答える
6

ネストされたグリッド ビューを実装しましたが、同じ問題に直面しました。次のように、イメージ ボタンの代わりに LinkBut​​ton を使用しました。

私はこのようなコラムを持っていた前に:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

こんな感じで交換しました。

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 
于 2011-04-21T12:34:03.750 に答える
5

同様の問題がありましたが、ASP.Net 1.1 を使用しておらず、JavaScript を介してコントロールを更新していませんでした。私の問題は Firefox でのみ発生し、IE では発生しませんでした (!)。

次のように、PreRender イベントの DropDownList にオプションを追加しました。

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

私の「HF」(hiddenfield)には、次のように改行で区切られたオプションがありました。

HF.value = "option 1\n\roption 2\n\roption 3";

問題は、ドロップダウンを表す「選択」のオプションで HTML ページが壊れていた (つまり、改行があった) ことでした。

だから私は1行を追加して私の問題を解決しました:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

これが誰かを助けることを願っています。

于 2010-11-14T16:05:19.640 に答える
4

あなたの問題に変更すればUseSubmitBehavior="True"UseSubmitBehavior="False"問題は解決されます

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
于 2011-02-20T07:37:17.533 に答える
3

私は同じ問題を抱えていました、私がしたこと:

条件を追加しただけで、if(!IsPostBack)正常に動作します:)

于 2011-08-05T08:55:28.647 に答える
2

この問題の簡単な解決策は、ページの読み込み時にIsPostBackチェックを使用することです。それはこの問題を解決します。

于 2010-01-13T04:58:10.597 に答える
2

これが超古い投稿であることは知っています。アプリケーションを呼び出していると仮定すると、次のアイデアが役に立ちました。

  1. ページに ICallbackEventHandler を実装する
  2. ClientScriptManager.GetCallbackEventReference を呼び出して、サーバー側のコードを呼び出します
  3. エラー メッセージに示されているように、ClientScriptManager.RegisterForEventValidation を呼び出すことができます。

完全な制御が必要ない場合は、これを行う更新パネルを使用できます。

于 2011-10-21T18:50:37.267 に答える
2

この場合、グリッドの RowDataBound のボタンに id を追加します。それはあなたの問題を解決します。

于 2009-05-05T12:55:11.183 に答える
2

Ajax UpdatePanelはそれを可能にします。Ajax ポストバックのオーバーヘッドを無視すれば、それが最も簡単な方法だと思います。

于 2008-12-21T14:16:02.213 に答える
1

Ajaxアップデートパネルを使用している場合。タグを追加<Triggers>し、その中にボタンまたはコントロールをトリガーして、postBackを使用します<asp:PostBackTrigger .../>

于 2011-05-04T12:50:57.253 に答える
1

私のために働いたのは、次のコードをpage_loadからpage_prerenderに移動することです。

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}
于 2010-10-14T21:35:27.863 に答える
1

行うための最良のオプションは、隠しフィールドを使用し、イベントの検証を無効にせず、すべてのリストボックス、ドロップダウンリストを変更して runat サーバー属性で選択することです

于 2011-06-14T13:12:44.373 に答える
1

これが私がそれを手に入れた理由でした:

ASP:ListBox がありました。最初は隠していました。クライアント側では、AJAX を介してオプションを設定します。ユーザーは 1 つのオプションを選択しました。その後、[送信] ボタンをクリックすると、サーバーは ListBox についておかしくなり、オプションがあることを覚えていないためです。

そのため、フォームをサーバーに送信する前に、すべてのリスト オプションをクリアするようにしました。そうすれば、リストがクライアントに空になり、空に戻ったので、サーバーは文句を言いませんでした。

並びました!!!

于 2013-10-11T13:56:52.437 に答える
1

4 分前に同じエラーを受け取りました。それから私はあなたのように30分研究しました。すべてのフォーラムで、彼らは一般的に「ページ enableEvent..=false または true を追加する」と言っています。提案された解決策は、私が見つけるまで問題を解決しませんでした。残念ながら、問題は ASP.NET ボタンです。2秒前に削除しました。「imagebutton」に置き換えようとしましたが、これも受け入れられませんでした (同じエラーが発生したため)。

最後に に交換しましたLinkButton。それは働いているようです!

于 2010-07-27T18:59:39.437 に答える
1

私は datalist を使用していましたが、プッシュ ボタンで同じエラーが発生していました。IsPostBack を使用してコントロールをチェックして埋めるだけで、問題は解決しました! 偉大な!!!

于 2010-03-08T13:49:03.900 に答える
1

入力できるデータが事前にわかっている場合は、ClientScriptManager を使用してこの問題を解決できます。以前のユーザー選択で JavaScript を使用してドロップダウン ボックスに動的に入力するときに、この問題が発生しました。

render メソッド (VB および C#) をオーバーライドし、ドロップダウン リスト ddCar の潜在的な値を宣言するコードの例を次に示します。

VB では:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

または、C# のわずかなバリエーションは次のようになります。

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

初心者向け: これはコード ビハインド ファイル (.vb または .cs) に入れるか、aspx ファイルで使用する場合は<script>タグでラップできます。

于 2012-12-19T09:50:41.753 に答える
0

2 つのリスト ボックスと 2 つのボタンという同じ問題がありました。

リスト ボックスのデータはデータベースから読み込まれ、ボタンをクリックすることでボックス間で項目を移動できました。

無効なポストバックを取得していました。

リストボックスに表示されたときに見えない改行が含まれているデータであることがわかりました。

IE 10 と IE 11 を除くすべてのブラウザで問題なく動作しました。

キャリッジ リターン ライン フィードを削除すると、すべて正常に動作します。

于 2013-11-06T16:04:03.643 に答える
0

参考までに、そのエラー メッセージで同じ問題が発生しました。同じページに 2 つのフォーム タグがあったことです。マスター ページに 1 つ、ページ自体に 1 つありました。2 番目のフォーム タグ ペアを削除するとすぐに、問題は解消されました。

于 2015-03-11T17:12:10.173 に答える
0

ItemDataBound に id を追加すると、エラーは表示されませんでしたが、コマンド名は表示されませんでした。コマンド名が空の状態で返されました。次に、ItemDataBound 中にコマンド名も追加しました。その後、同じ問題を解決しました。ありがとう、素晴らしい提案。出来た :)

于 2009-10-01T20:56:13.677 に答える
0

ListBox を親の Page/Control Controls コレクションに追加しないことで、この正確なエラーを回避しました。サーバー側の機能はまったく必要なかったからです。私はそれを使用して、カスタム サーバー コントロールの HTML を出力したかっただけで、OnRender イベント ハンドラーでそれを行いました。コントロールを使用することで、独自の html を応答に書き込む必要がなくなることを願っていました。

この解決策はおそらくほとんどの場合うまくいきませんが、コントロールはポストバック間でメモリに保持されないため、ASP.NET がコントロールに対して ValidateEvent を実行するのを防ぎます。

また、私のエラーは、選択したリスト項目が前回のポストバックのリストボックスになかった項目であることが原因でした。誰にでも役立つ場合。

于 2009-04-23T22:22:51.670 に答える
-1

バインドされたコントロールのデータを確認してください。一部の無効なデータが ValidateEvent を破損しています。

于 2010-09-23T08:32:02.173 に答える