RequiredFieldValidator でのクライアントサイドのバリデーションでは、全角空白のバリデーションはできません
RequiredFieldValidator を関連付けた TextBox に全角空白だけ入力して、ポストをしてもポストバックが発生します
しかし、サーバー側でのバリデーションではしっかりとエラーとなります
つまり、クライアントサイドのバリデーションとサーバー側でのバリデーション結果に食い違いが出てきます
まあ、JavaScript での検証と .NET Framework での検証なので差異があっても仕方はないのですが・・・
WebUIValidation.js には ValidatorTrim という関数があり、RequiredFieldValidator はこの関数を使用して前後の空白文字を取り除き、検証を行っています
この関数内で、取り除かれる空白文字は正規表現で \s で表されるものだけに限ります
全角空白は \s の空白文字にふくまれません
そのためこのような結果になります
でも、やっぱりクライアントサイドでも全角空白のバリデーションしたいですよね?
検証でクライアントサイドとサーバーサイドの結果が同じにこしたことはありませんよね?
そんな場合は、下記の関数をページに追加してください
function ValidatorTrim(text) {
if ((text == null) || (typeof(text) == "undefined")) {
return "";
}
return text.replace(/^([\s ]+)|([\s ]+)$/g, "");
}
つまり、ValidatorTrim 関数を上書きしてやればいいのです
この関数では、最初と最後の \s と全角空白を取り除いています
WebUIValidation.js を変更するとその時点で全ての Web アプリケーションに影響がでるし、文字コードの関係でうまくいかないことも多いので絶対にやらないようにしましょう
全部のページに関数を記述するのは面倒でしょうから、ページかコントロールから吐き出すようにしましょう
しかし、注意しなければならないのが
RegisterClientScriptBlock ではダメだということ(どうも、Register するタイミングで微妙に変わるみたいだ)
また、直接記述するときも head 要素内に記述してはダメです
WebUIValidation.js をインポートする script 要素は、RegisterClientScriptBlock でレンダリングされるスクリプトの直後にレンダリングされます
そのため、せっかく記載した ValidatorTrim がもともとの ValidatorTrim 関数で上書きしてしまい、元の木阿弥です
なので、RegisterStartupScript で出力するようにしましょう
直接記述するときは、ページ下部に(途中でも大丈夫だけど)
で、せっかくなので先ほどの関数を出力するだけのカスタムコントロールを作りました
ツールボックスに登録して、ページにドロップするだけでその画面において、全角空白のクライアントサイドでの検証が可能になります
ただし、画面内の個別の TextBox にだけ検証を可能にすることはできませんのであしからず・・・・
FullSpaceClientValidatableExtension_1.zip (v1.x 用)
FullSpaceClientValidatableExtension_2.zip (v2.0 用)
# obsolete なメソッドを変更して、v1.x と v2.0 を別途作成(2006.12.22 追記)