我正在尝试使用其数据注释手动验证对象。我们的模型在嵌套类中有注释,因此当我们从数据库模式自动更新它们时,它们不会被覆盖。
假设我有两个班级:
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]呢?请注意,我使用的是同一个项目中的元数据,而不是来自不同的项目。