【问题标题】:Prevent inheriting validation attributes in model防止在模型中继承验证属性
【发布时间】:2012-09-29 02:35:40
【问题描述】:

我正在使用其他自定义联系人模型类继承的基本联系人模型。

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。

这是一个失败的原因吗?我是否需要推出自己的支持禁用继承的版本?非常感谢任何帮助。

【问题讨论】:

    标签: asp.net-mvc inheritance validationattribute


    【解决方案1】:

    这可能是你真正想要一个新属性的情况

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

    【讨论】:

    • 这会替换属性吗?我尝试过使用 new(带有虚拟属性),但它似乎仍在验证中。
    • 我过去曾多次使用过这种策略。它应该是一个全新的属性,因此只有一个验证属性或另一个应该触发。当然,这取决于您如何声明或使用模型变量来确定实际使用的属性。如果它不起作用,您可能需要发布一些控制器代码,看看我们是否能找出原因。
    • 感谢您的回复,我今晚会再努力,甚至可以直接在网站上试用。
    • 见下面的答案和例子——从这个来看,它看起来不像会打球:(
    【解决方案2】:

    见下文,我创建了一个继承自另一个 BaseModel 的类 Model,使用 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

    从这个示例中,您似乎无法覆盖/隐藏/忽略继承的必需验证(尚未尝试其他)属性。

    【讨论】:

    • 我讨厌回答和接受自己的问题,但从上面的测试来看,原来的问题似乎无法完成。
    • 真的没有办法解决这个问题吗?
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多