使用自定义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...
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"
一样,并将其放置在我们想要的位置。