From a8c3c9e7db16818812e100f1cbf0bd4308f73bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 14 Dec 2017 16:37:58 +0300 Subject: [PATCH] Added ObjectValidator.Validate to identity create/edit user. --- .../AspNetCore/Mvc/RazorPages/AbpPageModel.cs | 5 +++- ...bjectValidator.cs => MvcModelValidator.cs} | 4 +-- .../Identity/Users/CreateModal.cshtml.cs | 3 ++- .../Pages/Identity/Users/EditModal.cshtml.cs | 3 ++- .../Abp/Validation/AbpValidationResult.cs | 18 +++++++++++++ .../Volo/Abp/Validation/IObjectValidator.cs | 4 +-- .../MethodInvocationValidationContext.cs | 10 +------- .../MethodInvocationValidatorBase.cs | 16 +++--------- .../Volo/Abp/Validation/ObjectValidator.cs | 25 ++++++++++++++++--- 9 files changed, 57 insertions(+), 31 deletions(-) rename src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/{MvcModelObjectValidator.cs => MvcModelValidator.cs} (64%) create mode 100644 src/Volo.Abp/Volo/Abp/Validation/AbpValidationResult.cs diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs index c164ae6b8e..0a5af5d7ee 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Guids; using Volo.Abp.ObjectMapping; using Volo.Abp.Uow; +using Volo.Abp.Validation; namespace Volo.Abp.AspNetCore.Mvc.RazorPages { @@ -19,8 +20,10 @@ namespace Volo.Abp.AspNetCore.Mvc.RazorPages public ILoggerFactory LoggerFactory { get; set; } - protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; + public IObjectValidator ObjectValidator { get; set; } + protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; + protected ILogger Logger => _lazyLogger.Value; private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelObjectValidator.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelValidator.cs similarity index 64% rename from src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelObjectValidator.cs rename to src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelValidator.cs index 5b5ed97939..182c023784 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelObjectValidator.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/MvcModelValidator.cs @@ -5,9 +5,9 @@ using Volo.Abp.Validation; namespace Volo.Abp.AspNetCore.Mvc.Validation { [ExposeServices(typeof(IMvcModelObjectValidator))] - public class MvcModelObjectValidator : ObjectValidator, IMvcModelObjectValidator + public class MvcModelValidator : ObjectValidator, IMvcModelObjectValidator { - public MvcModelObjectValidator(IOptions options) + public MvcModelValidator(IOptions options) : base(options, NullDataAnnotationValidator.Instance) { } diff --git a/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs b/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs index 70fcd1f365..0147de8f02 100644 --- a/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs +++ b/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs @@ -35,7 +35,8 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users public async Task OnPostAsync() { - //TODO: ModelState.IsValid..? + ObjectValidator.Validate(UserInfo, nameof(UserInfo)); + ObjectValidator.Validate(Roles, nameof(Roles)); var input = ObjectMapper.Map(UserInfo); input.RoleNames = Roles.Where(r => r.IsAssigned).Select(r => r.Name).ToArray(); diff --git a/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs b/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs index bdf49f4159..8c21f50fad 100644 --- a/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs +++ b/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs @@ -45,7 +45,8 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users public async Task OnPostAsync() { - //TODO: ModelState.IsValid..? + ObjectValidator.Validate(UserInfo, nameof(UserInfo)); + ObjectValidator.Validate(Roles, nameof(Roles)); var input = ObjectMapper.Map(UserInfo); input.RoleNames = Roles.Where(r => r.IsAssigned).Select(r => r.Name).ToArray(); diff --git a/src/Volo.Abp/Volo/Abp/Validation/AbpValidationResult.cs b/src/Volo.Abp/Volo/Abp/Validation/AbpValidationResult.cs new file mode 100644 index 0000000000..a9bf2c9fde --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Validation/AbpValidationResult.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Volo.Abp.Validation +{ + public class AbpValidationResult : IAbpValidationResult + { + public List Errors { get; } + + public List ObjectsToBeNormalized { get; } + + public AbpValidationResult() + { + Errors = new List(); + ObjectsToBeNormalized = new List(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Validation/IObjectValidator.cs b/src/Volo.Abp/Volo/Abp/Validation/IObjectValidator.cs index 91b27405fd..f0cb893d97 100644 --- a/src/Volo.Abp/Volo/Abp/Validation/IObjectValidator.cs +++ b/src/Volo.Abp/Volo/Abp/Validation/IObjectValidator.cs @@ -2,8 +2,8 @@ namespace Volo.Abp.Validation { public interface IObjectValidator { - void Validate(IAbpValidationResult validationResult, object validatingObject); + void Validate(object validatingObject, string name = null, bool allowNull = false); - void AddValidatationErrors(IAbpValidationResult validationResult, object validatingObject); + void AddValidatationErrors(IAbpValidationResult validationResult, object validatingObject, string name = null, bool allowNull = false); } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidationContext.cs b/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidationContext.cs index 5911b3a9c3..9f7a63bf7d 100644 --- a/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidationContext.cs +++ b/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidationContext.cs @@ -1,10 +1,8 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.Reflection; namespace Volo.Abp.Validation { - public class MethodInvocationValidationContext : IAbpValidationResult + public class MethodInvocationValidationContext : AbpValidationResult { public MethodInfo Method { get; } @@ -12,18 +10,12 @@ namespace Volo.Abp.Validation public ParameterInfo[] Parameters { get; } - public List Errors { get; } - - public List ObjectsToBeNormalized { get; } - public MethodInvocationValidationContext(MethodInfo method, object[] parameterValues) { Method = method; ParameterValues = parameterValues; Parameters = method.GetParameters(); - Errors = new List(); - ObjectsToBeNormalized = new List(); } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidatorBase.cs b/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidatorBase.cs index 3be13600e4..a6dc70d3e5 100644 --- a/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidatorBase.cs +++ b/src/Volo.Abp/Volo/Abp/Validation/MethodInvocationValidatorBase.cs @@ -95,19 +95,11 @@ namespace Volo.Abp.Validation protected virtual void AddMethodParameterValidationErrors(IAbpValidationResult context, ParameterInfo parameterInfo, object parameterValue) { - if (parameterValue == null) - { - if (!parameterInfo.IsOptional && - !parameterInfo.IsOut && - !TypeHelper.IsPrimitiveExtendedIncludingNullable(parameterInfo.ParameterType, includeEnums: true)) - { - context.Errors.Add(new ValidationResult(parameterInfo.Name + " is null!", new[] { parameterInfo.Name })); - } - - return; - } + var allowNulls = parameterInfo.IsOptional || + parameterInfo.IsOut || + TypeHelper.IsPrimitiveExtendedIncludingNullable(parameterInfo.ParameterType, includeEnums: true); - _objectValidator.AddValidatationErrors(context, parameterValue); + _objectValidator.AddValidatationErrors(context, parameterValue, parameterInfo.Name, allowNulls); } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Validation/ObjectValidator.cs b/src/Volo.Abp/Volo/Abp/Validation/ObjectValidator.cs index 7ebabdf58d..92375542c6 100644 --- a/src/Volo.Abp/Volo/Abp/Validation/ObjectValidator.cs +++ b/src/Volo.Abp/Volo/Abp/Validation/ObjectValidator.cs @@ -1,5 +1,6 @@ using System.Collections; using System.ComponentModel; +using System.ComponentModel.DataAnnotations; using System.Linq; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -20,9 +21,11 @@ namespace Volo.Abp.Validation _options = options.Value; } - public virtual void Validate(IAbpValidationResult validationResult, object validatingObject) + public virtual void Validate(object validatingObject, string name = null, bool allowNull = false) { - AddValidatationErrors(validationResult, validatingObject); + var validationResult = new AbpValidationResult(); + + AddValidatationErrors(validationResult, validatingObject, name, allowNull); if (validationResult.Errors.Any()) { @@ -31,10 +34,26 @@ namespace Volo.Abp.Validation validationResult.Errors ); } + + foreach (var objectToBeNormalized in validationResult.ObjectsToBeNormalized) + { + objectToBeNormalized.Normalize(); + } } - public virtual void AddValidatationErrors(IAbpValidationResult validationResult, object validatingObject) + public virtual void AddValidatationErrors(IAbpValidationResult validationResult, object validatingObject, string name = null, bool allowNull = false) { + if (validatingObject == null && !allowNull) + { + validationResult.Errors.Add( + name == null + ? new ValidationResult("Given object is null!") + : new ValidationResult(name + " is null!", new[] { name }) + ); + + return; + } + ValidateObjectRecursively(validationResult, validatingObject, 1); }