C# 正在触发的循环

C# 正在触发的循环,c#,C#,我试图使用DataAnnotation,并在从客户端接收数据时让它们进行验证 因此,我用数据注释装饰了我的对象 using System.ComponentModel.DataAnnotations; namespace SharedLib.Requests { public class RegistrationRequest: RequestBase { [Required(ErrorMessage = "Email is required"), String

我试图使用DataAnnotation,并在从客户端接收数据时让它们进行验证

因此,我用数据注释装饰了我的对象

using System.ComponentModel.DataAnnotations;

namespace SharedLib.Requests
{
    public class RegistrationRequest: RequestBase
    {
        [Required(ErrorMessage = "Email is required"), StringLength(50, MinimumLength = 7)]
        public string Email { get; set; }

        [Required(ErrorMessage = "Firstname is required"), StringLength(50)]
        public string Firstname { get; set; }

        [Required(ErrorMessage = "Surname is required"), StringLength(50)]
        public string Surname { get; set; }

        [Required, StringLength(15, MinimumLength = 7, ErrorMessage = "Password needs to be between 7 and 15 charactors")]
        public string Password { get; set; }

    }
}
然后我从我的客户机收到一个api调用。当数据无效时,我会得到我想要的,这是列出错误的结果

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace SharedLib.Requests
{
    public abstract class RequestBase : IValidatableObject
    {
        public virtual IEnumerable<ValidationResult> GetValidationResult()
        {
            return Validate(new ValidationContext(this));
        }
        public bool IsValid()
        {
            return Validate(new ValidationContext(this)).Count() == 0;
        }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            var results = new List<ValidationResult>();
            Validator.TryValidateObject(this, validationContext, results, true);
            return results;
        }
    }
}
如果我在
IsValid
调用上放置了一个断点,我的断点永远不会触发。它永远不会到达那个断点。在“IsValid”检查之前,正在验证模型

但当数据有效时,我就会陷入这种方法中,它只是循环,直到崩溃

有人能看出我做错了什么吗

编辑:调用堆栈:


问题在于TryValidate对象内部有代码:

// Step 3: Test for IValidatableObject implementation
            IValidatableObject validatable = instance as IValidatableObject;
            if (validatable != null) {
                IEnumerable<ValidationResult> results = validatable.Validate(validationContext);

                foreach (ValidationResult result in results.Where(r => r != ValidationResult.Success)) {
                    errors.Add(new ValidationError(null, instance, result));
                }
            }
//步骤3:测试IValidatableObject实现
IValidatableObject validable=实例为IValidatableObject;
如果(可验证!=null){
IEnumerable results=validable.Validate(validationContext);
foreach(ValidationResult in results.Where(r=>r!=ValidationResult.Success)){
添加(新的ValidationError(null、实例、结果));
}
}

所以你得到无限递归,你的代码永远不会返回,也不会因为堆栈溢出而死掉。您根本不需要实现Menet IValidatableObject接口。用数据注释验证进行装饰就足以获得验证

问题在于tryValidate对象内部有代码:

// Step 3: Test for IValidatableObject implementation
            IValidatableObject validatable = instance as IValidatableObject;
            if (validatable != null) {
                IEnumerable<ValidationResult> results = validatable.Validate(validationContext);

                foreach (ValidationResult result in results.Where(r => r != ValidationResult.Success)) {
                    errors.Add(new ValidationError(null, instance, result));
                }
            }
//步骤3:测试IValidatableObject实现
IValidatableObject validable=实例为IValidatableObject;
如果(可验证!=null){
IEnumerable results=validable.Validate(validationContext);
foreach(ValidationResult in results.Where(r=>r!=ValidationResult.Success)){
添加(新的ValidationError(null、实例、结果));
}
}

所以你得到无限递归,你的代码永远不会返回,也不会因为堆栈溢出而死掉。您根本不需要实现Menet IValidatableObject接口。用数据注释验证进行装饰就足以获得验证

如果这不起作用,请将断点设置为var results,然后点击它查看调用堆栈以查看初始化的重新验证。它也在做同样的事情。我在“var results=new List();”上有一个断点,在“if(Validator.TryValidateObject(this,validationContext,results,true))”上有另一个断点。当“if…”断点触发时,它将永远不会返回到。。。似乎该方法被调用,并且“var results…”上的断点再次触发。似乎“if”语句正在重新触发该方法。您可以发布stackAdded吗。只是一遍又一遍地回忆同一句话。啊,对了!所以我基本上是在做DataAnnotations在做的事情?这就解决了。感谢您的帮助。如果这没有帮助,请将断点设置为var results,然后点击它查看调用堆栈以查看初始化的重新验证。它也在做同样的事情。我在“var results=new List();”上有一个断点,在“if(Validator.TryValidateObject(this,validationContext,results,true))”上有另一个断点。当“if…”断点触发时,它将永远不会返回到。。。似乎该方法被调用,并且“var results…”上的断点再次触发。似乎“if”语句正在重新触发该方法。您可以发布stackAdded吗。只是一遍又一遍地回忆同一句话。啊,对了!所以我基本上是在做DataAnnotations在做的事情?这就解决了。谢谢你的帮助。
// Step 3: Test for IValidatableObject implementation
            IValidatableObject validatable = instance as IValidatableObject;
            if (validatable != null) {
                IEnumerable<ValidationResult> results = validatable.Validate(validationContext);

                foreach (ValidationResult result in results.Where(r => r != ValidationResult.Success)) {
                    errors.Add(new ValidationError(null, instance, result));
                }
            }