如何在嵌套类中使用注释进行验证

时间:2014-02-12 08:56:47

标签: asp.net-mvc model-validation

我正在尝试使用其数据注释手动验证对象。我们的模型在嵌套类中有注释,因此当我们从数据库模式自动更新它们时,它们不会被覆盖。

假设我有两个班级:

public class Person
{
    [StringLength(20, MinimumLength = 3, 
       ErrorMessage = "invalid length in Person.LOGIN")]
    public string Login { get; set; }
}

[MetadataType(typeof(Car_Metadata))]
public class Car
{
    public string Brand { get; set; }

    public class Car_Metadata
    {
        [StringLength(20, MinimumLength = 3, 
             ErrorMessage = "invalid length Car.Brand")]
        public string Brand{ get; set; }
    }
}

Person在同一个类上有数据注释,而Car则从Car_Metadata借用它们。然后,我可以使用以下代码段手动验证Person实例,并且它可以正常工作:

var p = new Person { Login = "x" }; //too short, should fail

var validationResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(
    instance: p,
    validationContext: new ValidationContext(p,  
                                             serviceProvider: null, 
                                             items: null),
    validationResults: validationResults,
    validateAllProperties: true);

Assert.IsTrue(validationResults.Count() > 0);

但是,这同样适用于Car

var c = new Car { Brand = "x" }; //too short, should fail

var validationResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(
    instance: c,
    validationContext: new ValidationContext(c,
                                             serviceProvider: null, 
                                             items: null),
    validationResults: validationResults,
    validateAllProperties: true);

Assert.IsTrue(validationResults.Count() > 0);

我不明白为什么它不起作用。 MetadataType不会使Car具有与Car_Metadata相同的元数据吗?

奇怪的是,这在ASP.net MVC视图中使用HTML帮助时起作用,如:

<%: Html.ValidationMessageFor(model => model.Brand) %>

...这让我觉得我只是缺少一些东西来检查“继承的”数据注释。

我做错了什么,或者没做错?

修改

根据Tewr的建议,https://stackoverflow.com/a/2467282/462087这显然已经解决了这个问题。但是,我很想知道为什么有必要再次明确添加元数据提供程序;什么是[MetadataType]呢?请注意,我使用的是同一个项目中的元数据,而不是来自不同的项目。

0 个答案:

没有答案