使用自定义ValidationResult处理数据注释验证

本文关键字:数据 注释 验证 处理 ValidationResult 自定义 | 更新日期: 2023-09-27 18:08:09

我有一个这样的自定义ValidationAttribute:

<>之前 public class ReceiverRegion : ValidationAttribute { private RegionService regionService; private CityService cityService; public ReceiverRegion() : base("Incorrect region code") { this.regionService = new RegionService(); this.cityService = new CityService(); } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { int regionId = Convert.ToInt32(value); int plate = Convert.ToInt32((validationContext.ObjectInstance as CorporateOrderItem).ReceiverCity); int productGroupId = Convert.ToInt32(validationContext.Items["productGroup"].ToString()); if (!CheckReceiverRegionExistence(regionId, plate, productGroupId)) { IEnumerable regions = this.regionService.GetList(cityService.GetByPlate(plate).PKCityId); return new CorporateOrderValidationResult(base.ErrorMessage, regions.Select(r=>r.Name)); } return CorporateOrderValidationResult.Success; } private bool CheckReceiverRegionExistence(int plate, int regionId, int productGroup) { return !(regionService.GetByCityAndRegionIdForProductGroup(plate, regionId, productGroup) == null); } } 之前

但是正如你在IsValid方法中看到的,我试图返回一个继承自ValidationResult的自定义对象。我的问题是,我不能访问我的CorporateOrderValidationResult实例的额外成员,因为IsValid返回基本ValidationResult类型。下面是我调用validate并获得ValidationResult集合作为返回值的代码。


List results = new List();
bool isValid = Validator.TryValidateObject(instance, context, results, true);

I tried to cast results object to List<CorporateOrderValidationResult>, but no matter what I try(for instance --> item as CorporateOrderValidationResult or results.OfType<CorporateOrderValidationResult>() or (CorporateOrderValidationResult)item) I either get InvalidCastException or null value. Is there a possible way to convert this list of result to a list of my custom result class? Thanks...

使用自定义ValidationResult处理数据注释验证

I tried to reproduce this behavior, but everything works as expected:

public class TestClass
{
    [TestValidation]
    public string TestProp { get; set; }
}
public class TestValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return new TestResult();
    }
}
public class TestResult : ValidationResult
{
    public TestResult()
        : base("test")
    {
    }
}

验证代码:

var instance = new TestClass();
var context = new ValidationContext(instance, null, null);
var results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(instance, context, results, true);
//Contains one instance of TestResult
var customResults = results.OfType<TestResult>().ToArray();

我知道这是一个老问题,但当你要求自定义ValidationResult类时,首先在谷歌搜索结果。Vyacheslav Volkov举了一个例子,为什么呢?

我今天花了几个小时试图使我的代码工作-关键行是:

public TestResult(): base ("test")

我根本不打算使用错误信息,我有自己的结构,所以我这样写我的函数:

public TestResult() : base("") -发送给基类的空字符串会产生文档中没有提到的后果。TryValidate()方法不会将我们的对象插入results集合中,因为它是由我们的IsValid()版本返回的,但会为该字段构建一个带有默认错误消息的新集合,就像"Field " + fieldName + " is Invalid"一样,并将其放置在我们想要的位置。