簡體   English   中英

C# WebAPI 自定義屬性驗證不起作用

[英]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 { }

REF: 如何:使用自定義屬性自定義數據模型中的數據字段驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM