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继承自另一个的类BaseModel,使用 new 关键字然后验证每个实例中的一个。据我所知,它们都使用基本属性。

为了清楚地说明验证例程,我添加了一个控件类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 回答