検証コントロール、特に RegularExpressionValidator は非常に便利で色々なフォーマットの検証ができます
が、毎回正規表現を設定するのも面倒だし、間違いが起こらないとも限らない
なので、「数値かどうか?」とか「英数だけか?」のような検証は頻繁にあるゆえに専用の検証コントロールがあったほうが便利
ここで CustomeValidator を使用するとクライアント側の JavaScript の設定が面倒だったりする
なので、こんなものを作ってちまちました検証コントロールを作ってたりする
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
namespace Wankuma.Pinzolo.Web.UI.WebControls
{
/// <summary>
/// 正規表現による単機能検証コントロールを作成するための抽象基本クラスの役割を果たします。
/// </summary>
public abstract class RegexValidatorBase : BaseValidator
{
/// <summary>
/// 派生クラスでオーバーライドされると、フィールドの書式の検証に使用する正規表現文字列を取得します。
/// </summary>
protected abstract string ValidationExpression
{
get;
}
/// <summary>
/// このメンバは <see cref="System.Web.UI.WebControls.BaseValidator.AddAttributeToRender"/> をオーバーライドします。
/// </summary>
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if (base.RenderUplevel)
{
// そのままお借りします
writer.AddAttribute("evaluationfunction", "RegularExpressionValidatorEvaluateIsValid");
if ((this.ValidationExpression != null) && (this.ValidationExpression.Length > 0))
{
writer.AddAttribute("validationexpression", this.ValidationExpression);
}
}
}
/// <summary>
/// このメンバは <see cref="System.Web.UI.WebControls.BaseValidator.EvaluateIsValid"/> をオーバーライドします。
/// </summary>
protected override bool EvaluateIsValid()
{
string text = base.GetControlValidationValue(base.ControlToValidate);
if ((text == null) || (text.Trim().Length == 0))
{
// 検証コントロールの基本仕様に沿いましょう
return true;
}
try
{
Match match = Regex.Match(text, this.ValidationExpression);
if (match.Success)
{
// 全文字列が一致したかどうか
return ((match.Index == 0) && (match.Length == text.Length));
}
else
{
// 見つからず
return false;
}
}
catch
{
// 正規表現として不適切
return true;
}
}
}
}
継承して、対象となる正規表現を設定してやればそれなりの専用検証コントロールが簡単にできるのではなかろうか?
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Wankuma.Pinzolo.Web.UI.WebControls
{
[ToolBoxData("<{0}:EnglishValidator runat=server></{0}:EnglishValidator>")]
public class EnglishValidator : RegexValidatorBase
{
protected override string ValidationExpression
{
get { return @"^[^A-Za-z.,!?\s]+$"; }
}
}
}
例えばこんなもの
入力文字が(なんとなく)英文だったらエラーになる検証コントロールだ
まあ、英文だとアウトなんて要件はまずないだろうけども・・・・
そこで、こいつを更に継承してこんなことをしてやる
public override string Text
{
get { return "欧米か!"; }
set {}
}
TakaAndToshiValidator の完成である