2012-10-08 8 views
5

他のカスタム連絡先モデルクラスが継承するベースコンタクトモデルを使用しています。モデルの検証属性を継承しないようにする

public class BaseContactModel 
{ 
    [Required(ErrorMessage = "Firstname is required")] 
    public virtual string FirstName { get; set; } 
} 

ベースコンタクトモデルは、フラグにプロパティを検証属性を使用して必要ないくつかのケースでは、私はそれを上書きしたり停止したいです。これは可能でしょうか?

public class ContactModel : BaseContactModel 
{ 
    [NotRequired] 
    public override string FirstName { get; set; } 
} 

私は だけでtrueを返すためにをNotRequired新しい検証属性を使用しようとしましたが、属性だけで実行されているので、必要な& NotRequiredを積み上げされて表示され、検証が失敗しています。

(私は見つけることができませんでした)ソリューションを探しに私はいくつかの無関係な属性は「継承」プロパティを持っていることがわかったが、私はSystem.ComponentModel.DataAnnotationsでネイティブの検証属性でこれを表示されません。

これは失われた原因ですか?継承を無効にするのをサポートする独自のバージョンをロールバックする必要がありますか?どんな助けでも大歓迎です。

答えて

2

をしたい場合であってもよいが、各インスタンスのいずれかを検証しました。私が見ることのできるところからは、両方とも基本属性を使用しています。

妥当性検査ルーチンを明確にするために、コントロールクラスControlModelを追加しました。

class Program 
{ 
    static void Main(string[] args) 
    { 
     ValidationTest<Model>(); 
     ValidationTest<BaseModel>(); 
     ValidationTest<ControlModel>(); 

     Console.Read(); 
    } 

    private static void WriteAttributeInfo<T>() 
    { 
     Console.WriteLine(string.Concat(typeof(T), " attributes:")); 
     typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList(); 
    } 

    private static void ValidationTest<T>() 
    { 
     object obj = Activator.CreateInstance<T>(); 
     Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>()))); 
    } 
} 

class ControlModel 
{ 
    public string FirstName { get; set; } 

    public string Email { get; set; } 
} 

class BaseModel 
{ 
    [RequiredAttribute] 
    public virtual string FirstName { get; set; } 

    [RequiredAttribute] 
    public virtual string Email { get; set; } 
} 

class Model : BaseModel 
{ 
    public new string FirstName { get; set; } 

    public new string Email { get; set; } 
} 

ConsoleApplication1.Model試験:のisValid = Falseの

ConsoleApplication1.BaseModel試験:のisValid = Falseの

ConsoleApplication1.ControlModel試験:のisValid = Trueの

からこの例では、継承された必須のvalidatioをオーバーライド/非表示/無視できないようですn(まだ他人を試していない)属性。

+0

私は自分自身の質問に答えることを嫌いますが、上記のテストから、元の質問のように思えます。 –

+0

これは本当に解決策ではありませんか? – Giorgio

0

これは別のBaseModelから継承Modelは、新しいキーワードを使用し、この下に、私が作成した1つのクラスを参照してください、あなたが実際に新しいプロパティ

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

これが属性を置き換えますか?私は新しい(仮想プロパティで)を使用しようとしましたが、それはまだ検証を打つようです。 –

+0

私はこの戦略を過去数回使ってきました。これは新しいプロパティである必要があります。したがって、1つの検証属性または他の検証属性のみが起動されます。もちろん、実際にどのプロパティが使用されているかを判断するためにモデル変数を宣言または使用する方法によって異なります。動作していない場合は、コントローラコードを投稿して理由を把握できるかどうか確認してください。 – dumdum

+0

あなたの返事をありがとう、私は今晩別の努力をし、おそらくボックスのまっすぐサイトで試してみることがあります。 –

関連する問題