5

2 つのリストボックスと、2 つのリスト間でアイテムを交換できるいくつかのボタンで構成されるアイテム スワッパー コントロールを作成しました。スワップは、javascript を使用して行われます。また、リスト内でアイテムを上下に移動します。基本的に、項目を右側のリスト ボックスに移動すると、要素のデータキー (GUID) が隠しフィールドに格納されます。ポストバックでは、フィールドから GUID を読み取るだけです。すべてがうまく機能しますが、ポストバックで次の例外が発生します。

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

テストアプリケーションを用意しました。アーカイブをダウンロードしてプロジェクトを実行するだけです。Web ページで 3 つの項目を選択し、[すべて追加] を押してから、3 番目の要素を 1 レベル上に移動し、[ボタン] をクリックします。エラーが表示されます。イベントの検証をオフにすることは、決して受け入れられません。誰でも私を助けることができますか、私は解決策を見つけることなくすでに2日を過ごしました.

テストアプリケーション

4

7 に答える 7

3

問題は、リストの保存されたビュー ステートとポストバックで受信したデータが一致しないことです。イベント検証の問題は、このアプローチが原因で発生する可能性がある問題の 1 つにすぎない可能性が最も高いです。Web フォームのアーキテクチャでは、この種の使用は許可されておらず、イベントの検証の問題を回避できたとしても、このアプローチではさらに多くの問題が発生する可能性があります。いくつかの選択肢があります:

1) 最も簡単な方法は、javascript を使用する代わりに、サーバー上でスワッピング ロジックを実行することです。このようにして、ポストバック間でビュー ステートが保持され、サーバーへの複数のラウンド トリップによる追加のオーバーヘッドが問題にならない場合があります。

2) サーバーへの複数回の往復が問題になる場合は、独自のビュー ステートを処理するサーバー コントロールを記述します。もちろん、これは非常に魅力的なアプローチです。

3) 中間のアプローチは、2 つの単純な html リストを使用し (asp.net コントロールを使用せずに html タグを記述するだけです)、クライアント側で JavaScript から非表示フィールドに ID のリストを保持することです。ポストバック時に、隠しフィールドを解析し、HTML リストを無視して ID を抽出します。

それに対する深刻な議論がなければ、私は 1 にします。

于 2008-10-17T19:08:16.463 に答える
1

いくつかの可能なオプション:

  • 可能であれば、2 つのリストで ViewState を無効にします。ViewState がないと、サーバーは元の値が何であったかを認識できないため、エラーは発生しません。このアプローチでは、リストを再作成する必要があり (ViewState がないため)、選択を手動で追跡する必要があるか、OnInit フェーズでリストを作成する必要があります。

  • イベントの検証を無効にする (可能な場合)

  • サーバー側で両方のリストを完全に作成し、必要に応じてクライアント側スクリプト (javascript) を使用して 2 つのリストからエントリを削除します。

于 2008-10-18T04:52:03.850 に答える
0

最初のオプションでは、かなりのオーバーヘッドが発生します。リストボックス クラスから派生した独自のカスタム リストボックス コントロールを定義し、loadpostback データのオーバーライドを実行しました。

public class CustomListBox : ListBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        return true;
    }
}

ユーザーコントロールで通常のリストボックスの代わりにこれを使用すると問題は解決しましたが、私のアプローチに関連するリスクはありますか?

于 2008-10-17T19:26:20.683 に答える
0

たまたま、これはもう試しましたか?何らかの方法でリストをいじるたびに、これを行ってください。

document.getElementById("listbox").selectedIndex = -1;
于 2008-10-18T21:19:37.193 に答える
0

または、ListBox の代わりにサーバー側の HtmlSelect を使用して、イベントの検証の問題を回避することもできます。何よりも、コード ビハインドの多くをそのままにしておくことができる場合があります (つまり、リスト作成ロジックは ListBox と同じです)。

<select runat="server" id="myList" multiple="true" />
于 2011-11-22T05:26:07.097 に答える
0

リストで選択されたアイテムがレンダリングされたときにリストに存在しなかったため、不平を言っています。PostBack の代わりに、AJAX 経由で PageMethods を使用してデータをフォームに戻すことを検討してください。または、リスト要素を前後に移動する順序付けられていないリストのように、非入力コントロールを使用してデータを保持します。必要に応じて GUID を取得できるリスト要素内の隠しスパンに GUID を配置できます。

于 2008-10-17T17:59:07.710 に答える