Forums: Open Discussion (Thread #19739)

TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-08-28 15:08 by Anonymous #38539)

ASP.NETのCustomValidatorコントロールのイベントハンドラ内で、StringLengthRangeValidatorを使った文字列長チェックを行おうとしているのですがうまくいかないので、以下のようなコードでテストしたところ、すべてIsValidがfalseになりました。
----------------------------
ValidationResults result;
string errorMessage;
string[] testValueArray;
int maxLength;
int minLength;

minLength = 5;
maxLength = 20;

StringLengthRangeValidator stringLengthRangeValidator = new StringLengthRangeValidator(minLength, RangeBoundaryType.Inclusive, maxLength, RangeBoundaryType.Inclusive, null, false);

errorMessage = stringLengthRangeValidator.MessageTemplate;

testValueArray = new string[] { "000", "12345", "ABCDEFG890", "00000000001111111111++", "1234567890", "12345678901234567890123"};

foreach (string testValue in testValueArray)
{
result = stringLengthRangeValidator.Validate(testValue);
if (!result.IsValid)
{
// "{2}" には {3} 文字未満または {5} 文字より大きい文字列を入力してください。
_log.Debug(string.Format(errorMessage, null, null, "この値" + testValue,minLength,null,maxLength));
}
else
{
_log.Debug(testValue + "はバリデーションはOKです");
}
}
【ログ】
"この値000" には 5 文字以上 20 文字以下の文字列を入力してください。
"この値12345" には 5 文字以上 20 文字以下の文字列を入力してください。
"この値ABCDEFG890" には 5 文字以上 20 文字以下の文字列を入力してください。
"この値00000000001111111111++" には 5 文字以上 20 文字以下の文字列を入力してください。
"この値1234567890" には 5 文字以上 20 文字以下の文字列を入力してください。
"この値12345678901234567890123" には 5 文字以上 20 文字以下の文字列を入力してください。

ByteRangeValidatorでも同様になってしまいます。
他のフレームワークから提供されているバリデータもざっくりテストしてみましたが
思ったとうりの結果が得られていますので、使い方に大きな勘違いをしているのではないと思っているのですが。
ご教授をお願いできないでしょうか。

Reply to #38539×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-08-29 12:18 by Anonymous #38572)

投稿者です。
誤解を招く表現があったので訂正します。
(誤)他のフレームワークから提供されているバリデータもざっくりテストしてみましたが
(正)他の、フレームワークから提供されているバリデータもざっくりテストしてみましたが
Reply to #38539

Reply to #38572×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-09-01 10:48 by tatsumihr #38610)

StringLengthRangeValidatorのインスタンスを生成したときにStringLengthRangeValidator型で受けているようですが、Microsoft.Practices.EnterpriseLibrary.Validation.Validator型で受けてください。

◆実装例
--------------------
Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator = new StringLengthRangeValidator(minLength, RangeBoundaryType.Inclusive, maxLength, RangeBoundaryType.Inclusive, null, false);

ValidationResults vabResults = validator.Validate(testValue);
--------------------

元々はデータセットに対する検証をかけることを目的としているため、このような仕様になっています。
Microsoft.Practices.EnterpriseLibrary.Validation.Validator型で受けて、再度ご確認ください。
Reply to #38539

Reply to #38610×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-09-01 11:34 by tatsumihr #38613)

追記です。

StringLengthRangeValidator は、Object型に対しても入力値検証をかけられるようにしたいという設計時の思想がありました。
したがって、内部的には DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults) メソッドをオーバーライドして、
objectToValidate.ToString().Length で文字列長を取得しています。

今回の件では、StringLengthRangeValidator.Validate メソッドの引数に、String型を指定しています。
String型を指定すると、StringLengthRangeValidator の
DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults) メソッドではなく、
親クラス TypeRangeValidator の DoValidate(IComparable objectToValidate, object currentTarget, string key, ValidationResults validationResults) メソッドが直接呼ばれてしまいます。
これはメソッドのオーバーロードで、String型がIComparableインターフェイスを実装しているため、
より厳密に型付けされたメソッドが呼ばれるためのようでした。

データセットに対する検証をかける場合、
Microsoft.Practices.EnterpriseLibrary.Validation.Validator.Validate(object target)メソッドで検証を行うため、
現状の仕様で問題ないのですが、
今回のように直接Validatorを呼び出す場合、
オーバーロードで呼ばれるメソッドがあいまいになるという問題になってしまいます。

Validatorを直接使用するときに直感的な結果が返ってこないのは良くないため、
次回リリース時に現状の仕様を再検討するようにいたします。
Reply to #38610

Reply to #38613×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-09-02 15:57 by Anonymous #38650)

StringLengthRangeValidatorのインスタンスを生成したとき、Microsoft.Practices.EnterpriseLibrary.Validation.Validator型で受けることによって正しく文字列チェックができるようになりました。ありがとうございました。理由も理解できましたが、できたら私のような「間違った」使い方でもうまく動いてくれると開発者にやさしいかもと思いました。
Reply to #38613

Reply to #38650×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: TERASOLUNA ServerFW.NET(WEB版)のバリデータについて (2008-09-02 17:00 by tatsumihr #38652)

貴重なご意見として、今後の機能改善につなげさせていただきたいと思います。
Reply to #38650

Reply to #38652×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login