読者です 読者をやめる 読者になる 読者になる

個人的なメモ 〜Cocos Sharp 情報を中心に‥

Tomohiro Suzuki @hiro128_777 のブログです。Cocos Sharp の事を中心に書いています。 Microsoft MVP for Visual Studio and Development Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

ASP.NET ButtonコントロールにおけるOnClientClickによる確認ダイアログとValidatorの順番を調整する。

ASP.NETのButtonコントロールでOnClientClickによる確認ダイアログとValidatorを併用した場合、確認ダイアログでOKを押した後、Validatorが走るという悲しい状況になってしまいます。

これを解消するために、Buttonコントロールを拡張しました。

自動生成されるJavaScriptに手を入れ、明示的にValidatorを走らせてから確認ダイアログを出しています。

ついでなので、確認時のメッセージも設定できるようにしておきました。

/// <summary>
/// Web ページにプッシュ ボタン コントロールを表示します。
/// </summary>
public class ExtendedButton : System.Web.UI.WebControls.Button
{

	/// <summary>
	/// 確認ダイアログを表示するかどうかを示す値を取得または設定します。
	/// </summary>
	[DefaultValue(false)]
	[Category("Behavior")]
	public bool RequiresConfirmation
	{
		get
		{
			object obj = this.ViewState["RequiresConfirmation"];
			if(obj != null)
			{
				return (bool)obj;
			}
			return false;
		}
		set
		{
			if(value != this.RequiresConfirmation)
			{
				this.ViewState["RequiresConfirmation"] = value;
			}
		}
	}

	/// <summary>
	/// 確認ダイアログに表示するメッセージを取得または設定します。
	/// </summary>
	[DefaultValue("")]
	[Localizable(true)]
	[Category("Appearance")]
	public string ConfirmationMessage
	{
		get
		{
			object obj = this.ViewState["ConfirmationMessage"];
			if(obj != null)
			{
				return (string)obj;
			}
			return "よろしいでしょうか?";
		}
		set
		{
			if(value != this.ConfirmationMessage)
			{
				this.ViewState["ConfirmationMessage"] = value;
			}
		}
	}

	protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
	{
		string ensuringString = base.Attributes["onclick"];
		if(this.RequiresConfirmation == true)
		{
			string fireValidatorScript = 
				"if(typeof(Page_ClientValidate) == 'function')" +
				"{if(Page_ClientValidate('" + this.ValidationGroup + "') == false){return false;}}";
			string firstString = this.OnClientClick;
			string confirmationScript = "if(confirm('" + this.ConfirmationMessage + "') == false)" +
				"{return false;}";
			if(String.IsNullOrEmpty(firstString) == true)
			{
				base.Attributes["onclick"] = fireValidatorScript + confirmationScript;
			}
			else
			{
				base.Attributes["onclick"] = fireValidatorScript + confirmationScript + firstString;
				this.OnClientClick = String.Empty;
			}
		}
		base.AddAttributesToRender(writer);
	}

}

以上です。