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