ポストバックまたはコールバック引数が無効です。イベント検証は「<pages enableEventValidation=“true”/>」を使用して有効になります

StackOverflow https://stackoverflow.com/questions/228969

質問

クライアント側からページをポストバックすると、次のエラーが発生します。クライアント側で 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
役に立ちましたか?

解決

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

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

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

他のヒント

Page_Loadイベントにコードがありますか? 「はい」の場合、おそらく以下を追加することで役立ちます。

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

コマンドをクリックしてPage_loadを再度実行すると、このエラーがスローされます。通常のライフサイクルでは Page_Load-&gt; [コマンド]をクリックします-&gt; Page_Load(再び)-&gt; ItemCommandイベントの処理

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

「ポストバックまたはコールバック引数が無効です。イベント検証は、in configurationまたは<%@ page enabableventValidation = "true"%>をページで使用して有効になります。セキュリティ上の理由から、この機能は、ポストバックまたは コールバック イベントは、最初にレンダリングされたサーバー コントロールから発生します。データが有効で予期される場合は、 ClientScriptManager.RegisterForEventValidation メソッドを使用して、検証用のポストバックまたはコールバック データを登録します。

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

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

2) 実装しました ClientScript.RegisterForEventValidation 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) グリッド列のボタンのタイプを次から変更しました。 PushButtonLinkButton. 出来た! (「ボタンタイプ = リンクボタン」)。それ以外の場合は、ボタンを「LinkBut​​ton」などの他のコントロールに変更できれば、正常に動作すると思います。

イベントの検証を無効にしないで、本当に2または3を実行したいです。

asp:listboxクライアント側へのアイテムの追加には、2つの主な問題があります。

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

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

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

次に、投稿する準備ができたら、変更した&lt; select&gt; から非表示フィールドの内容を再入力します。それから、もちろん、サーバー上でそれを再度分割し、アイテムを操作する必要があります。選択が空になったので、サーバー上に戻ったからです。

全体として、これは非常に面倒な解決策ですが、実際にはお勧めしませんが、listBoxのクライアント側の変更を実際に行う必要がある場合は機能します。ただし、このルートに進む前にupdatePanelを確認することをお勧めします。

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

私のために働いたのは、EnableViewState =&quot; false&quot;を設定することでした。リピーター用。利点は、WebサイトまたはWebページのイベント検証をオフにするのと同じくらい簡単に使用できることですが、スコープはいずれかのイベント検証をオフにするよりもはるかに少ないです。

上記のどれもうまくいきませんでした。さらに掘り下げた後、問題を引き起こしているページに適用された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をformタグから移動する必要がありました。

クライアントで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つのリストボックス間でアイテムを移動していました.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);
}

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

つまり。

public class ListBoxNoEventValidation : ListBox 
{
}

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

3:グリッドのボタンの種類を変更しました 列を "PushButton" から "LinkButton"です。出来た!("ButtonType="リンクボタン")もし、 ボタンを [その他] に変更できます 他の "LinkButton" のようなコントロール 場合によっては、正しく機能します。

アミールさん、あなたに投票できたらいいのにと思います (悲しいことに、私の担当者が低すぎます。) 私はまさにこの問題を抱えていて、これを変更すると私のグリッドビューでは見事に機能しました。少し余談ですが、有効なコードは次のとおりだと思います。ButtonType="リンク"

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

(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/

.aspxページでそのようなことを試みます

追加

  

EnableEventValidation =&quot; false&quot;

ご質問はお気軽にどうぞ!

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

また、DDLから選択されたデータを取得するには、「OnChange」を添付できます。非表示の入力またはStyle =&quot; display:none;&quot;

でテキストボックスに値を収集するためのDDLへのイベント

ネストされたグリッドビューを実装しましたが、同じ問題に直面しました。次のように画像ボタンの代わりに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> 

同様の問題がありましたが、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);

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

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

問題は、&quot; select&quot;のオプションでHTMLページが壊れている(改行があることを意味する)ことでした。 DropDownを表しました。

それで、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);

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

UseSubmitBehavior =&quot; True&quot; UseSubmitBehavior =&quot; False&quot; に変更すると、問題は解決します

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

同じ問題がありました。私がしたこと:

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

このエラーはポストバックなしで表示されます

コードの追加:

If(!IsPostBack){

 //do something

}

この場合、グリッドのRowDataBoundのボタンにidを追加します。問題が解決します。

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

Ajax UpdatePanel が成功し、 Ajaxポストバックのオーバーヘッドを無視して、最も簡単な方法だと思います。

これは非常に古い投稿であることを知っています。あなたがあなたのアプリケーションを呼び出していると仮定すると、ここに私のために働いたアイデアがあります:

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

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

通常のASPXページをコンテンツページに変換するときに、この同じ問題に遭遇しました。

この問題のあるページには、コンテンツセクションの1つに&lt; / form&gt; タグが含まれていたため、実行時に2つのフォーム終了タグがレンダリングされ、この問題が発生しました。ページから余分なフォームの終了タグを削除すると、この問題は解決しました。

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

最後に私はと置き換えました LinkButton. 。うまくいっているようです!

データリストを使用していて、プッシュボタンで同じエラーが発生していました。 IsPostBackを使用してコントロールをチェックして入力するだけで、問題は解決しました!素晴らしい!!!

私にとってうまくいったのは、次のコードを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>");
}

最適なオプションは、非表示フィールドを使用し、イベント検証を無効にしないことです。また、すべてのリストボックス、ドロップダウンリストを変更して、runatサーバー属性で選択します

Ajax更新パネルを使用している場合。 &lt; Triggers&gt; タグを追加し、その中に&lt; asp:PostBackTrigger ... /&gt;

を使用してpostBackを引き起こすボタンまたはコントロールをトリガーします

入力できるデータを事前に知っている場合、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ファイルで使用する場合は、&lt; script&gt; タグで囲むことができます。

これが私がそれを得た理由でした:

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

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

ソート済み!!!

ニックBが言ったように、私にとってはうまくいったので、場合によっては改行を削除する必要があります。コードを見てください:

-間違った方法:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

-正しい方法:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

IE10 +でのみ発生しました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top