![](/img/trans.png)
[英]Custom Validation Attribute not validating on Model - WebAPI C# and JSON
[英]C# WebAPI Custom attribute validation not working
我有一個未觸發的自定義驗證屬性。 詳情請參考以下代碼。
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);
}
}
自定義屬性未觸發並且 isvalid 返回 true,它應該是 false,因為 Address 類中的屬性之一是必需的,並且沒有提供。 為了完成這項工作,我應該添加哪些內容?
該示例似乎缺少這一部分:
使類不可繼承。 添加
NotInheritable
在Visual Basic中的關鍵字或sealed
在Visual C#關鍵字。例如:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] sealed public class CustomAttribute : ValidationAttribute { }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.