2013-04-19 4 views
9

モデルのプロパティで[EmailAddress] .net 4.5のDataAnnotationを返します。これは ''という電子メールフィールドは有効な電子メールアドレスではありません。 '、電子メールプロパティが空の場合の検証中にエラーが発生しました。EmailAddressAttributeは不要です

これは技術的には真実ですが、この空の値は[Required]アノテーションでしか捕捉できないと予想していました。

空の文字列を検証できるように[EmailAddress]アノテーションに渡すことができるパラメータがありますか?またはカスタムバリデータの正規表現を使用する必要がありますか?

答えて

7

EmailAddressAttributeのパラメータはありません。

if (value == null) 
{ 
    return true; 
} 
string input = value as string; 
return ((input != null) && (_regex.Match(input).Length > 0)); 

をと正規表現は(空の文字列の一致は存在しません)次のように定義されます:このattibuteの検証コードは、次のされて、あなたの缶継承を作成することができますあなたの目標を達成するために

_regex = new Regex(@"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$", RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); 

DataTypeAttributeからIsValidメソッドをオーバーライドするので、空または空文字列に対してはtrueを返し、インスタンスはEmailAddressAttributeを使用します。これは次のようになります。

public override bool IsValid(object value) 
{ 
    if (value == null) 
    { 
     return true; 
    } 
    string input = value as string; 
    var emailAddressAttribute = new EmailAddressAttribute(); 

    return (input != null) && (string.IsNullOrEmpty(input) || emailAddressAttribute.IsValid(input)); 
} 
+2

* EmailAddressAttribute *から継承することができます。あなたは作曲を使う必要があります。 –

+1

また、 'value as string'の後に' IsNullOrEmpty'が続くと、文字列ではない値が電子メールアドレスとして扱われます。例えば。 '5.5M'は、このIsValidの実装によると、電子メールアドレスです。 –

+1

@ ta.speot.is良い点です!そして、文字列以外の値についてはまったく正しいです。渡されたパラメータのタイプを考慮に入れた実装で私の答えを拡張しました。 –

0

その他の方法は、APIを別の方法で呼び出すことです。 JSONの場合、発信者に"Email": nullを提供するか、このプロパティを本文に含めないように依頼してください。空の要素<Email></Email>を提供しているXMLの場合、電子メールが利用できない場合、メッセージ本文からこの要素を削除してください。

JSONプロパティがnullまたは存在しないかXML要素が存在しない場合、モデル内のフィールドはnullになり、[Required]が追加されていないと存在しないため、検証エラーがスローされません。この方法では、必要なドライブかどうかを判断できます。

私はいくつかのインスタンスで "怠け者"または呼び出し不能な呼び出し側が、特にXMLに対して、空の値を持つ同じボディを送信したいことがあることは理解しています。 "私はこのメールを<Email></Email>に送信しています。お客様が私にメールを提供しなかったためです"