C# WebAPI 自定义属性验证不起作用



我有一个未触发的自定义验证属性。有关更多详细信息,请参阅以下代码。

public HttpResponseMessage GetTestResponse()
{
var model = new TestClass1()
{
Id = 1,
address = new Address() { StreetName = "test" }
};
bool validateAllProperties = false;
var results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(
model,
new ValidationContext(model, null, null),
results,
validateAllProperties);
if (isValid)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest);
}
}
public class TestClass1
{
public string Name { get; set; }
[Required,Range(1,5)]
public int Id { get; set; }
[Required]
[ValidateObject("StreetNumber is required")]
public Address address { get; set; }
}
public class Address
{
[Required]
public int? StreetNumber { get; set; }
public string StreetName { get; set; }
}
public class ValidateObjectAttribute : ValidationAttribute
{
public ValidateObjectAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}
protected override ValidationResult IsValid(object value, 
ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var context = new ValidationContext(value, null, null);
Validator.TryValidateObject(value, context, results, true);
if (results.Count != 0)
{
var compositeResults = new CompositeValidationResult(String.Format("Validation for {0} failed!", validationContext.DisplayName));
results.ForEach(compositeResults.AddResult);
return compositeResults;
}
return ValidationResult.Success;
}
}
public class CompositeValidationResult : ValidationResult
{
private readonly List<ValidationResult> _results = new List<ValidationResult>();
public IEnumerable<ValidationResult> Results
{
get
{
return _results;
}
}
public CompositeValidationResult(string errorMessage) : base(errorMessage) { }
public CompositeValidationResult(string errorMessage, IEnumerable<string> memberNames) : base(errorMessage, memberNames) { }
protected CompositeValidationResult(ValidationResult validationResult) : base(validationResult) { }
public void AddResult(ValidationResult validationResult)
{
_results.Add(validationResult);
}
}

自定义属性未触发且返回 true 无效,该属性应为 false,因为 Address 类中的一个属性是必需的,并且未提供。 为了完成这项工作,我是否应该添加一块?

该示例似乎缺少此部分:

使类不可继承。在 Visual Basic 中添加NotInheritable关键字,或在 Visual C# 中添加sealed关键字。

例如:

[AttributeUsage(AttributeTargets.Property | 
AttributeTargets.Field, AllowMultiple = false)]
sealed public class CustomAttribute : ValidationAttribute
{
}

REF:如何:使用自定义属性自定义数据模型中的数据字段验证

最新更新