ドロップダウンリストに動的に項目を追加し、項目を選択してポストバックを発生させると例外は発生します。下図はUpdatePanelを使用して非同期ポストバックを発生させた場合に表示されるダイアログ。

 

 

"無効なポストバックまたはコールバック引数です。イベントの検証は、構成の<pages enableEventValidation="true"/>,または、<%@ Page EnableEventValidation="true" %>を使用して有効にされます。セキュリティの目的により、この機能は、イベントをポストバックまたはコールバックする引数がそれらを最初に表示したサーバーコントロールからはこうされていることを確認します。データが有効であり、予期されている場合、検証のためのポストバックまたはコールバックデータを登録するためにClientScriptManager.RegisterForEventValidationメソッドを使用して下さい。"と表示されます。(打つのがつかれます。)

セキュリティのことを考えて、検証をfalseにしたくはありません。RegisterForEventValidationメソッドを使用して、動的に項目が作成されているコントロールと追加されうる値を登録しておけばよいのですが、特定できない場合や数が多い場合は非現実的です。そこで、カスタムドロップダウンコントロールを作成して、例外が発生させないようにします。

動作確認環境

  • Windows XP SP2
  • 開発環境:Visual Studio 2005 英語版
  • 動作環境:.NET 2.0, Visual Studio 2005 組み込みサーバ

1. CascadeEnabledDropDownクラスの作成

次のように作成しました。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ComponentGeek.SampleControl
{
    /// <summary>
    /// Summary description for NoValidateDropDown
    /// </summary>
    public class CascadeEnabledDropDown : DropDownList
    {
        public CascadeEnabledDropDown()
        {
        }
        /// <summary>
        /// ポストされたデータをロードする。クライアントで動的にドロップダウン項目が作成された
        /// 場合に対応できるように、ポストされたデータがオリジナルのデータにない場合は、
        /// ドロップダウン項目として追加する。
        /// </summary>
        /// <param name="postDataKey"></param>
        /// <param name="postCollection"></param>
        /// <returns></returns>
        protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            string value = postCollection[postDataKey];
            if (value != null && this.Items.FindByValue(value) == null)
            {
                Items.Add(value);
                SelectedValue = value;
            }
            return base.LoadPostData(postDataKey, postCollection);
        }
    }
}

AJAX Contrtol ToolKitのサイトで問題となっていたので回避作として挙がっていたサブクラスを作るという対応(回避作そのままではないです)を実装してみました。