Browse Source

Refactored AbpValidationHtmlAttributeProvider

pull/3834/head
Halil İbrahim Kalkan 7 years ago
parent
commit
53e295363e
  1. 12
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/Metadata/AbpModelMetadataProvider.cs
  2. 20
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs
  3. 88
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs

12
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ModelBinding/Metadata/AbpModelMetadataProvider.cs

@ -1,11 +1,11 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.Validation;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.ModelBinding.Metadata namespace Volo.Abp.AspNetCore.Mvc.ModelBinding.Metadata
@ -14,14 +14,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ModelBinding.Metadata
[ExposeServices(typeof(IModelMetadataProvider))] [ExposeServices(typeof(IModelMetadataProvider))]
public class AbpModelMetadataProvider : DefaultModelMetadataProvider public class AbpModelMetadataProvider : DefaultModelMetadataProvider
{ {
private static readonly PropertyInfo ValidationAttributeErrorMessageStringProperty;
static AbpModelMetadataProvider()
{
ValidationAttributeErrorMessageStringProperty = typeof(ValidationAttribute)
.GetProperty("ErrorMessageString", BindingFlags.Instance | BindingFlags.NonPublic);
}
public AbpModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider) public AbpModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider)
: base(detailsProvider) : base(detailsProvider)
{ {
@ -56,7 +48,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ModelBinding.Metadata
{ {
if (validationAttribute.ErrorMessage == null) if (validationAttribute.ErrorMessage == null)
{ {
validationAttribute.ErrorMessage = ValidationAttributeErrorMessageStringProperty.GetValue(validationAttribute) as string; ValidationAttributeHelper.SetDefaultErrorMessage(validationAttribute);
} }
} }
} }

20
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using System.Text;
namespace Volo.Abp.AspNetCore.Mvc.Validation
{
public static class ValidationAttributeHelper
{
private static readonly PropertyInfo ValidationAttributeErrorMessageStringProperty = typeof(ValidationAttribute)
.GetProperty("ErrorMessageString", BindingFlags.Instance | BindingFlags.NonPublic);
public static void SetDefaultErrorMessage(ValidationAttribute validationAttribute)
{
validationAttribute.ErrorMessage =
ValidationAttributeErrorMessageStringProperty.GetValue(validationAttribute) as string;
}
}
}

88
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs

@ -1,6 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.DataAnnotations; using Microsoft.AspNetCore.Mvc.DataAnnotations;
@ -12,6 +10,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.ModelBinding; using Volo.Abp.AspNetCore.Mvc.ModelBinding;
using Volo.Abp.AspNetCore.Mvc.Validation;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.Abp.Validation.Localization; using Volo.Abp.Validation.Localization;
@ -20,7 +19,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ViewFeatures
{ {
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
[ExposeServices(typeof(ValidationHtmlAttributeProvider))] [ExposeServices(typeof(ValidationHtmlAttributeProvider))]
public class AbpValidationHtmlAttributeProvider public class AbpValidationHtmlAttributeProvider
: DefaultValidationHtmlAttributeProvider, ISingletonDependency : DefaultValidationHtmlAttributeProvider, ISingletonDependency
{ {
private readonly IModelMetadataProvider _metadataProvider; private readonly IModelMetadataProvider _metadataProvider;
@ -29,15 +28,15 @@ namespace Volo.Abp.AspNetCore.Mvc.ViewFeatures
private readonly IValidationAttributeAdapterProvider _validationAttributeAdapterProvider; private readonly IValidationAttributeAdapterProvider _validationAttributeAdapterProvider;
public AbpValidationHtmlAttributeProvider( public AbpValidationHtmlAttributeProvider(
IOptions<MvcViewOptions> optionsAccessor, IOptions<MvcViewOptions> optionsAccessor,
IModelMetadataProvider metadataProvider, IModelMetadataProvider metadataProvider,
ClientValidatorCache clientValidatorCache, ClientValidatorCache clientValidatorCache,
IValidationAttributeAdapterProvider validationAttributeAdapterProvider, IValidationAttributeAdapterProvider validationAttributeAdapterProvider,
IStringLocalizerFactory stringLocalizerFactory, IStringLocalizerFactory stringLocalizerFactory,
IStringLocalizer<AbpValidationResource> validationStringLocalizer) IStringLocalizer<AbpValidationResource> validationStringLocalizer)
: base( : base(
optionsAccessor, optionsAccessor,
metadataProvider, metadataProvider,
clientValidatorCache) clientValidatorCache)
{ {
_metadataProvider = metadataProvider; _metadataProvider = metadataProvider;
@ -47,52 +46,85 @@ namespace Volo.Abp.AspNetCore.Mvc.ViewFeatures
} }
public override void AddValidationAttributes( public override void AddValidationAttributes(
ViewContext viewContext, ViewContext viewContext,
ModelExplorer modelExplorer, ModelExplorer modelExplorer,
IDictionary<string, string> attributes) IDictionary<string, string> attributes)
{ {
base.AddValidationAttributes(viewContext, modelExplorer, attributes); base.AddValidationAttributes(viewContext, modelExplorer, attributes);
AddExtraPropertyValidationsAttributes(viewContext, modelExplorer, attributes);
}
protected virtual void AddExtraPropertyValidationsAttributes(ViewContext viewContext, ModelExplorer modelExplorer, IDictionary<string, string> attributes)
{
var nameAttribute = attributes.GetOrDefault("name"); var nameAttribute = attributes.GetOrDefault("name");
var propertyName = ExtraPropertyBindingHelper.ExtractExtraPropertyName(nameAttribute); if (nameAttribute == null)
if (propertyName == null)
{ {
return; return;
} }
//NOTE: containerName can be null on controller actions..? var extraPropertyName = ExtraPropertyBindingHelper.ExtractExtraPropertyName(nameAttribute);
if (extraPropertyName == null)
{
return;
}
//TODO: containerName can be null on controller actions..?
var containerName = ExtraPropertyBindingHelper.ExtractContainerName(nameAttribute); var containerName = ExtraPropertyBindingHelper.ExtractContainerName(nameAttribute);
if (containerName == null) if (containerName == null)
{ {
return; return;
} }
if (modelExplorer.Container?.ModelType == null)
{
return;
}
var extensibleObjectType = modelExplorer.Container.ModelType var extensibleObjectType = modelExplorer.Container.ModelType
.GetProperty(containerName, BindingFlags.Instance | BindingFlags.Public) .GetProperty(containerName, BindingFlags.Instance | BindingFlags.Public)
.PropertyType; ?.PropertyType;
if (extensibleObjectType == null)
{
return;
}
var extensionPropertyInfo = ObjectExtensionManager.Instance.GetPropertyOrNull(
extensibleObjectType,
extraPropertyName
);
var propertyInfo = ObjectExtensionManager.Instance.GetPropertyOrNull(extensibleObjectType, propertyName); if (extensionPropertyInfo == null)
{
return;
}
modelExplorer.Metadata.As<DefaultModelMetadata>().DisplayMetadata.DisplayName = () => propertyInfo.DisplayName.Localize(_stringLocalizerFactory); if (modelExplorer.Metadata is DefaultModelMetadata metadata)
{
metadata.DisplayMetadata.DisplayName =
() => extensionPropertyInfo.DisplayName.Localize(_stringLocalizerFactory);
}
foreach (var validationAttribute in propertyInfo.ValidationAttributes) foreach (var validationAttribute in extensionPropertyInfo.ValidationAttributes)
{ {
var validationContext = new ClientModelValidationContext( var validationContext = new ClientModelValidationContext(
viewContext, viewContext,
modelExplorer.Metadata, modelExplorer.Metadata,
_metadataProvider, _metadataProvider,
attributes); attributes
);
if (validationAttribute.ErrorMessage == null)
{
ValidationAttributeHelper.SetDefaultErrorMessage(validationAttribute);
}
validationAttribute.ErrorMessage = ValidationAttributeErrorMessageStringProperty.GetValue(validationAttribute) as string; var validationAttributeAdapter = _validationAttributeAdapterProvider.GetAttributeAdapter(
validationAttribute,
_validationStringLocalizer
);
_validationAttributeAdapterProvider.GetAttributeAdapter(validationAttribute, _validationStringLocalizer) validationAttributeAdapter.AddValidation(validationContext);
.AddValidation(validationContext);
} }
} }
private static readonly PropertyInfo ValidationAttributeErrorMessageStringProperty = typeof(ValidationAttribute)
.GetProperty("ErrorMessageString", BindingFlags.Instance | BindingFlags.NonPublic);
} }
} }

Loading…
Cancel
Save