问题: 除了使用 Validator.TryValidateObject 之外,还有其他方法可以验证 DataAnnotations
为什么:
如果您希望它验证 IValidatableObject
,则无法指定 Validator 。如果仅在对象有效时才对其进行验证,那将是可以的。
我要完成的任务: 获取所有验证结果的列表
如果您查看 Validator.TryValidateObject
中的反编译代码,请深入了解 GetObjectValidationErrors
。你会得到这个(为了更容易阅读,我已经重新格式化了)
private static IEnumerable<Validator.ValidationError> GetObjectValidationErrors(object instance, ValidationContext validationContext, bool validateAllProperties, bool breakOnFirstError)
{
var list = new List<Validator.ValidationError>();
list.AddRange(Validator.GetObjectPropertyValidationErrors(instance, validationContext, validateAllProperties, breakOnFirstError));
if (list.Any())
return list; //Doesn't continue if errors are found
var validationAttributes = Validator._store.GetTypeValidationAttributes(validationContext);
list.AddRange(Validator.GetValidationErrors(instance, validationContext, validationAttributes, breakOnFirstError));
if (list.Any(()))
return list; //Doesn't continue if errors are found
var validatableObject = instance as IValidatableObject;
if (validatableObject != null)
{
foreach (ValidationResult validationResult in Enumerable.Where<ValidationResult>(validatableObject.Validate(validationContext), (Func<ValidationResult, bool>) (r => r != ValidationResult.Success)))
list.Add(new Validator.ValidationError((ValidationAttribute) null, instance, validationResult));
}
return list;
}
正如您所看到的,一旦获得一组验证结果,它就会崩溃。
最佳答案
您是否尝试过查看 ControllerContext 中的 ModelState 属性?假设您有一个名为 Index 的 Controller 操作接受发布的模型。在此方法中,您可以检查 ModelState 属性并使用一点 LINQ 魔法,获取模型的所有验证错误。这种方法不会告诉您验证错误的来源。只是一个文本错误消息,可能还有异常。
public ActionResult Index(MyModel model)
{
if( !ModelState.IsValid){
var errors = this.ModelState.Values.SelectMany(x => x.Errors);
}
return View();
}
关于c# - 从 Validator.TryValidateObject 获取所有 ValidationResults,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21027629/