6

他のカスタム コンタクト モデル クラスが継承するベース コンタクト モデルを使用しています。

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; }
}

新しい検証属性NotRequiredを使用して true を返そうとしましたが、属性が積み上げられているように見えるため、Required と NotRequired が実行され、検証が失敗しています。

解決策を探していると(見つけることができませんでした)、関連のない属性に「継承された」プロパティがあることがわかりましたが、System.ComponentModel.DataAnnotationsのネイティブ検証属性にはこれがありません。

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

4

2 に答える 2

2

以下を参照してください。Model別の から継承する 1 つのクラスを作成BaseModelし、 new キーワードを使用してから、各インスタンスの 1 つを検証しました。私が見る限り、どちらも base 属性を使用しています。

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

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

于 2012-10-10T10:11:05.570 に答える
0

これは、実際に新しいプロパティが必要な場合です。

 public class ContactModel : BaseContactModel 
{
        [NotRequired]
        public new string FirstName { get; set; } 
}
于 2012-10-08T20:00:19.277 に答える