2009-08-25 7 views
0

テキストボックスにASP.NET正規表現検証ツールを使用する際に問題が発生しています。 これは私のコードの要約版である:私は投げとNullReferenceExceptionを取得する場所「error」のマークNullReference(ASP.NET)

RegularExpressionValidator regex = new RegularExpressionValidator(); 
regex.ID = "TextBoxRegExValidator" +  ((AVPEditControl)avpControl).ThisFieldRID.ToString(); //random name 
regex.ControlToValidate = ((AVPEditControl)avpControl).TextControlID; //this is valid. 
regex.ValidationExpression = "\d{3}-\d{2}-\d{4}"; 
regex.Text = "epic fail"; 
//later, in an event handler 
regex.Display = ValidatorDisplay.None; 
regex.ErrorMessage = ""; 
regex.Validate(); //ERROR 
bool valid = AVPEdit.Validator.IsValid; 

。私はここで紛失しているものは見当たりません。なぜなら、正規表現はそのコンテキストではnullではなく、それが検証するコントロールではないことをデバッガで確認したからです。

エラーメッセージの表示方法をより細かく制御したいので、正規表現をどのパネルにもフックしないようにしました。

なぜそれからヌル参照が得られるのでしょうか? (これは.NETのバグですか?)

また、これはVisibleを0に設定しても機能しますが、IsValidは常にtrueになります。

答えて

2

すべてのASP.NETバリデータは、機能するためにページの一部でなければなりません。 Validateメソッドは値を返さないことに注意してください。これは、あなたがそれを使用している方法で使用することを意図されていないためです。

Validateメソッドの内部では、IDでコントロールをルックアップしようとしていますが、親ネーミングコンテナは使用できません。あなたがそれをやっているやり方では、(それがコントロールを見つけることができないために)妥当性を検証する価値はありません。

私は、次のいずれかを実行します:

1)、ASPXでバリデータを入れて、そのValidateメソッドを使用して、その後IsValidプロパティを確認してください。 DisplayをNoneに設定すると、UIに表示されません。

2)正規表現を手動で実行してください。 Regex.IsMatchを使用するだけであれば、必要以上に多くのコードを書くことになります。

(それがコントロールコレクションの一部でなくてはnullになりとりわけthis.NamingContainerを呼び出すしようとする場所を参照してくださいよ、あなたはリフレクターを使用している場合、RegularExpressionValidatorを参照していることに注意してください)

+0

Regexを使うだけに変更しました。私はC#が正規表現の裸の基本を持っていたことに気付かなかった。 – Earlz

1

私はあなたのコントロールのコレクションに、おそらく目に見えないdivコントロールの中でそれを動作させるために追加するべきだと思います。

しかし、プログラムでテキストボックスを検証する場合は、パターンを使用して制御を検証し、有効性を返すメソッドを作成するだけでよいのですか?

+0

良い点は、おそらくすべきです。 しかし、ページ全体が動的に作成されます。私はdiv内に置くことはできません、コントロールを作成し、ページに動的に追加する必要があります。私はパネル(ページに添付されていない)を作成し、それにバリデーターを追加しようとしましたが、それは何もしませんでした。 – Earlz

0

検証のためにコードを使用したい場合は、このようなものを使用できます。

Match m = Regex.Match(yourtext,"\d{3}-\d{2}-\d{4}") 

if(m.Success) 
{ 
//valid 
} 

else 
{ 
//invalid 
} 
関連する問題