2011-06-22 16 views
1

私の目標は、IPアドレスの正規表現または動的DNSアドレスに対して検証される検証済みのIPアドレスフィールドを作成することです。したがって、基本的にユーザーが有効なIPアドレスまたは有効な動的DNSアドレスを入力すると、クライアントはそれを通過させます。カスタムフィールドの作成方法とデータフィールドの複数の属性の方法を示す記事は見つかりましたが、それらをOR条件として実行する方法については何も見つかりませんでした。OR条件付き複数の属性を使用するMVC

public class IPAddressAttribute : RegularExpressionAttribute 
    { 
     public IPAddressAttribute() 
      : base(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") 
     { } 
    } 
    public class DomainNameAttribute : RegularExpressionAttribute 
    { 
     public DomainNameAttribute() 
      : base(@"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$") 
     { } 
    } 

そして、ここでは、フィールドのための私のコードです:

[Required(ErrorMessage="Wan IP is required")] 
[DisplayName("Wan IP")] 
[IPAddress(ErrorMessage="Enter a valid IP")] 
[DomainName(ErrorMessage="Enter a valid Domain Name")] 
public virtual string wan_ip { get; set; } 

このコードは、現在両方の属性にチェックします。ここ

は、IPおよびドメイン名は、カスタム属性のために私のコードです。有効なIPアドレスを入力すると、有効なドメイン名を入力する必要があると返されます。有効なドメイン名は両方の属性を検証しようとしているためわかります。それらは相互に排他的であるため、決して両方を満たすことはできません。

ご意見をいただければ幸いです!

ありがとうございます!

マシュー

答えて

2

を見ることができます。カスタム属性の作成にはMSDNにarticleがあります。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
sealed public class CustomAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     IPAddressAttribute a1 = new IPAddressAttribute(); 
     DomainNameAttribute a2 = new DomainNameAttribute(); 
     return a1.IsValid(value) || a2.IsValid(value); 
    }  
} 
3

私はあなたが、単一の属性にマージする必要が

のようなもの[DomainOrIPAddress]

そして属性の中にあなたのOR論理を扱うでしょうかなり確信しています。

それとも、あなたはカスタム検証属性を作成し、その内部に2つの既存のものを使用することができますカスタムモデルバリへ

0

Jasonが提案した戦略を使用して、「Or」ロジックを処理するためのより一般的な属性を作成することもできます。私がこれを行うために見つけた最良の方法は、2つの属性のTypeを受け取り、内部的にそれらをアクティブにすることです(属性に強い引数の制約があるため)。

使用法:

[OneOfAttribute(typeof(IPAddressAttribute), typeof(DomainNameAttribute), ...)] 

実装:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public sealed class OneOfAttribute : ValidationAttribute 
{ 
    public ValidationAttribute[] Validators { get; set; } 

    public OneOfAttribute(params Type[] validatorTypes) 
    { 
     Validators = validatorTypes.Select(Activator.CreateInstance) 
      .OfType<ValidationAttribute>() 
      .ToArray(); 

     // just to make sure this was correctly invoked 
     if (validatorTypes.Length != Validators.Length) 
     { 
      throw new ArgumentException("Invalid validation attribute type"); 
     } 
    } 

    public override bool IsValid(object value) 
    { 
     return Validators.Any(v => v.IsValid(value)); 
    } 
} 

は、論理演算の種類を指定する引数を追加して、あなたはまた、これは、より柔軟にすることができ、この戦略を使用して(OR、AND、など)を使用して、IsValidメソッドで使用されます。

関連する問題