public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context) { var model = context.Model; if (model == null) { return Enumerable.Empty<ModelValidationResult>(); } var validatable = model as IValidatableObject; if (validatable == null) { var message = Resources.FormatValidatableObjectAdapter_IncompatibleType( typeof(IValidatableObject).Name, model.GetType()); throw new InvalidOperationException(message); } var validationContext = new ValidationContext( instance: validatable, serviceProvider: context.ActionContext?.HttpContext?.RequestServices, items: null); return ConvertResults(validatable.Validate(validationContext)); }
/// <summary> /// Validates a single node in a model object graph. /// </summary> /// <returns><c>true</c> if the node is valid, otherwise <c>false</c>.</returns> protected virtual bool ValidateNode() { var state = ModelState.GetValidationState(Key); // Rationale: we might see the same model state key used for two different objects. // We want to run validation unless it's already known that this key is invalid. if (state != ModelValidationState.Invalid) { var validators = Cache.GetValidators(Metadata, ValidatorProvider); var count = validators.Count; if (count > 0) { var context = new ModelValidationContext( Context, Metadata, MetadataProvider, Container, Model); var results = new List <ModelValidationResult>(); for (var i = 0; i < count; i++) { results.AddRange(validators[i].Validate(context)); } var resultsCount = results.Count; for (var i = 0; i < resultsCount; i++) { var result = results[i]; var key = ModelNames.CreatePropertyModelName(Key, result.MemberName); // It's OK for key to be the empty string here. This can happen when a top // level object implements IValidatableObject. ModelState.TryAddModelError(key, result.Message); } } } state = ModelState.GetFieldValidationState(Key); if (state == ModelValidationState.Invalid) { return(false); } else { // If the field has an entry in ModelState, then record it as valid. Don't create // extra entries if they don't exist already. var entry = ModelState[Key]; if (entry != null) { entry.ValidationState = ModelValidationState.Valid; } return(true); } }
/// <summary> /// Validates a single node in a model object graph. /// </summary> /// <returns><c>true</c> if the node is valid, otherwise <c>false</c>.</returns> protected virtual bool ValidateNode() { var state = _modelState.GetValidationState(_key); // Rationale: we might see the same model state key used for two different objects. // We want to run validation unless it's already known that this key is invalid. if (state != ModelValidationState.Invalid) { var validators = _validatorCache.GetValidators(_metadata, _validatorProvider); var count = validators.Count; if (count > 0) { var context = new ModelValidationContext( _actionContext, _metadata, _metadataProvider, _container, _model); var results = new List <ModelValidationResult>(); for (var i = 0; i < count; i++) { results.AddRange(validators[i].Validate(context)); } var resultsCount = results.Count; for (var i = 0; i < resultsCount; i++) { var result = results[i]; var key = ModelNames.CreatePropertyModelName(_key, result.MemberName); // If this is a top-level parameter/property, the key would be empty, // so use the name of the top-level property if (string.IsNullOrEmpty(key) && _metadata.PropertyName != null) { key = _metadata.PropertyName; } _modelState.TryAddModelError(key, result.Message); } } } state = _modelState.GetFieldValidationState(_key); if (state == ModelValidationState.Invalid) { return(false); } else { // If the field has an entry in ModelState, then record it as valid. Don't create // extra entries if they don't exist already. var entry = _modelState[_key]; if (entry != null) { entry.ValidationState = ModelValidationState.Valid; } return(true); } }
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context) { throw new NotImplementedException(); }
/// <summary> /// Validates the context against the <see cref="ValidationAttribute"/>. /// </summary> /// <param name="validationContext">The context being validated.</param> /// <returns>An enumerable of the validation results.</returns> public IEnumerable<ModelValidationResult> Validate(ModelValidationContext validationContext) { if (validationContext == null) { throw new ArgumentNullException(nameof(validationContext)); } if (validationContext.ModelMetadata == null) { throw new ArgumentException( Resources.FormatPropertyOfTypeCannotBeNull( nameof(validationContext.ModelMetadata), typeof(ModelValidationContext)), nameof(validationContext)); } if (validationContext.MetadataProvider == null) { throw new ArgumentException( Resources.FormatPropertyOfTypeCannotBeNull( nameof(validationContext.MetadataProvider), typeof(ModelValidationContext)), nameof(validationContext)); } var metadata = validationContext.ModelMetadata; var memberName = metadata.PropertyName ?? metadata.ModelType.Name; var container = validationContext.Container; var context = new ValidationContext( instance: container ?? validationContext.Model, serviceProvider: validationContext.ActionContext?.HttpContext?.RequestServices, items: null) { DisplayName = metadata.GetDisplayName(), MemberName = memberName }; var result = Attribute.GetValidationResult(validationContext.Model, context); if (result != ValidationResult.Success) { // ModelValidationResult.MemberName is used by invoking validators (such as ModelValidator) to // construct the ModelKey for ModelStateDictionary. When validating at type level we want to append // the returned MemberNames if specified (e.g. person.Address.FirstName). For property validation, the // ModelKey can be constructed using the ModelMetadata and we should ignore MemberName (we don't want // (person.Name.Name). However the invoking validator does not have a way to distinguish between these // two cases. Consequently we'll only set MemberName if this validation returns a MemberName that is // different from the property being validated. var errorMemberName = result.MemberNames.FirstOrDefault(); if (string.Equals(errorMemberName, memberName, StringComparison.Ordinal)) { errorMemberName = null; } string errorMessage = null; if (_stringLocalizer != null && !string.IsNullOrEmpty(Attribute.ErrorMessage) && string.IsNullOrEmpty(Attribute.ErrorMessageResourceName) && Attribute.ErrorMessageResourceType == null) { errorMessage = GetErrorMessage(validationContext); } var validationResult = new ModelValidationResult(errorMemberName, errorMessage ?? result.ErrorMessage); return new ModelValidationResult[] { validationResult }; } return Enumerable.Empty<ModelValidationResult>(); }
public IEnumerable <ModelValidationResult> Validate(ModelValidationContext context) { throw new NotImplementedException(); }