5

さまざまなコントロールを備えたWebページがあります。それらのうちの2つはドロップダウンリストです。最初のドロップダウンリストは、page_loadイベントのxmlファイルから入力されます。これは正常に機能します。最初のドロップダウンリストには、最初のドロップダウンリストの選択が変更されるたびにWebサービスを呼び出すカスケードドロップダウンリストエクステンダーがアタッチされます。これも問題なく動作します。2つのドロップダウンリストの下に、ページを元に戻すボタンがあります。ただし、2番目のドロップダウンリストで選択を行い、ボタンをクリックすると、次のエラーが発生します。

'/'アプリケーションのサーバーエラー。無効なポストバックまたはコールバック引数。イベント検証は、構成で使用するか、ページで<%@ Page EnableEventValidation = "true"%>を使用して有効にします。セキュリティ上の理由から、この機能は、ポストバックまたはコールバックイベントへの引数が、それらを最初にレンダリングしたサーバーコントロールから発生していることを確認します。データが有効で期待される場合は、ClientScriptManager.RegisterForEventValidationメソッドを使用して、検証のためにポストバックまたはコールバックデータを登録します。説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとエラーがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

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

ソースエラー:

現在のWebリクエストの実行中に、未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[ArgumentException:無効なポストバックまたはコールバック引数。イベント検証は、構成で使用するか、ページで<%@ Page EnableEventValidation = "true"%>を使用して有効にします。セキュリティ上の理由から、この機能は、ポストバックまたはコールバックイベントへの引数が、それらを最初にレンダリングしたサーバーコントロールから発生していることを確認します。データが有効で期待される場合は、ClientScriptManager.RegisterForEventValidationメソッドを使用して、検証用のポストバックまたはコールバックデータを登録します。] System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId、String arguments)+10945696 System.Web.UI .WebControls.DropDownList.LoadPostData(String postDataKey、NameValueCollection postCollection)+72 System.Web.UI.Page.ProcessPostData(NameValueCollection postData、Boolean fBeforeLoad)+507System.Web.UI.Page。

ひどいフォーマットでごめんなさい。このエラーがスローされる理由とそれを防ぐ方法についての提案はありますか?

ありがとう、
ベン

4

3 に答える 3

4

これは、 AJAXCascadingDropDownエクステンダーの既知の問題です。

正しく機能させるには、イベント検証を無効にする必要があります。

この問題について議論しているスレッドは次のとおりです:http: //forums.asp.net/t/1032053.aspx

同じ問題が発生したため、CascadingDropDownエクステンダーを使用せずに、通常のクライアント側のドロップダウンリストといくつかのjQueryを使用しました。

2つのオプションがあります。

  1. AJAX CascadingDropDownを破棄し、通常のドロップダウンに置き換え、クライアントクリックでjQuery/javascriptを使用してWebサービスを呼び出します。
  2. ページのイベント検証を無効にします。(非推奨)。

イベント検証は、リクエスト間でページの状態が改ざんされるのを防ぎます。残念ながら、AJAX CDDLは、何らかの理由でこれを正確に実行します。

ページ全体に影響を与え、セキュリティの問題を引き起こす可能性があるため、CDDLを機能させるためだけに無効にする必要はありません。

私のアドバイスは、弾丸をかみます-CDDLを捨てて、jQueryに置き換えます。

于 2010-08-03T03:44:29.633 に答える
3

私は自分の質問に対する答えを見つけました。

問題は、AJAXが新しい値をドロップダウンリストに追加しますが、それらがビューステートにないため、ASP.NETがエラーで停止することです。この問題を解決する方法を説明する素晴らしいブログ投稿がここにあります、それは私にとって素晴らしい働きをしました。

基本的に、SupportsEventValidation属性を削除するドロップダウンリストクラスをサブクラス化するだけです-> ASP.NETは値を検証しなくなり、すべてが正常に実行されます!

ここで投稿全体を読んでください: SupportsEventValidation属性を削除するためのDropDownListのサブクラス化

于 2010-08-03T03:46:03.097 に答える
0

私はたくさん検索し、この回避策に行き着きました:http: //avinashsing.sunkur.com/2011/03/24/dropdownlist-in-asp-net-does-not-retain-control-state/

一般ユーザーの場合、親ページ:

Protected Sub cbGenericDropDownList_DataBound(sender As Object、e As System.EventArgs)If Not IsNothing(HttpContext.Current.Request(DirectCast(sender、DropDownList).UniqueID))Then DirectCast(sender、DropDownList).SelectedValue = _ HttpContext.Current.Request (DirectCast(sender、DropDownList).UniqueID)End If End Sub

次に、ページ内のDropDownListコントロールごとに、次を追加します。OnDataBound = "cbGenericDropDownList_DataBound"

于 2012-10-03T11:58:28.940 に答える