mirror of https://github.com/abpframework/abp.git
committed by
GitHub
3 changed files with 111 additions and 0 deletions
@ -0,0 +1,34 @@ |
|||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using Microsoft.AspNetCore.Mvc.DataAnnotations; |
||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; |
||||
|
using Microsoft.Extensions.Localization; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations; |
||||
|
|
||||
|
public class EnumDataTypeAttributeAdapter : AttributeAdapterBase<EnumDataTypeAttribute> |
||||
|
{ |
||||
|
public EnumDataTypeAttributeAdapter( |
||||
|
EnumDataTypeAttribute attribute, |
||||
|
IStringLocalizer? stringLocalizer) |
||||
|
: base(attribute, stringLocalizer) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public override void AddValidation(ClientModelValidationContext context) |
||||
|
{ |
||||
|
Check.NotNull(context, nameof(context)); |
||||
|
|
||||
|
//There is no built-in client side validation rule for enum values.
|
||||
|
//This adapter is used to localize the error message on the server side.
|
||||
|
} |
||||
|
|
||||
|
public override string GetErrorMessage(ModelValidationContextBase validationContext) |
||||
|
{ |
||||
|
Check.NotNull(validationContext, nameof(validationContext)); |
||||
|
|
||||
|
return GetErrorMessage( |
||||
|
validationContext.ModelMetadata, |
||||
|
validationContext.ModelMetadata.GetDisplayName() |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,72 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.DataAnnotations; |
||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding; |
||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; |
||||
|
using Microsoft.Extensions.Localization; |
||||
|
using Shouldly; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations; |
||||
|
|
||||
|
public class AbpValidationAttributeAdapterProvider_Tests |
||||
|
{ |
||||
|
private readonly AbpValidationAttributeAdapterProvider _provider = new(new ValidationAttributeAdapterProvider()); |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Return_An_Adapter_For_The_EnumDataTypeAttribute() |
||||
|
{ |
||||
|
//ASP.NET Core does not provide an adapter for the EnumDataTypeAttribute.
|
||||
|
new ValidationAttributeAdapterProvider() |
||||
|
.GetAttributeAdapter(new EnumDataTypeAttribute(typeof(MyEnum)), null) |
||||
|
.ShouldBeNull(); |
||||
|
|
||||
|
_provider.GetAttributeAdapter(new EnumDataTypeAttribute(typeof(MyEnum)), null) |
||||
|
.ShouldBeOfType<EnumDataTypeAttributeAdapter>(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Localize_The_Error_Message_Of_The_EnumDataTypeAttribute() |
||||
|
{ |
||||
|
var attribute = new EnumDataTypeAttribute(typeof(MyEnum)) { ErrorMessage = "MyEnumIsInvalid" }; |
||||
|
|
||||
|
var adapter = _provider.GetAttributeAdapter(attribute, new TestStringLocalizer())!; |
||||
|
|
||||
|
adapter.GetErrorMessage(CreateValidationContext()).ShouldBe("Localized:MyEnumIsInvalid"); |
||||
|
} |
||||
|
|
||||
|
private static ModelValidationContextBase CreateValidationContext() |
||||
|
{ |
||||
|
var metadataProvider = new EmptyModelMetadataProvider(); |
||||
|
|
||||
|
return new ClientModelValidationContext( |
||||
|
new ActionContext(), |
||||
|
metadataProvider.GetMetadataForProperty(typeof(MyModel), nameof(MyModel.Value)), |
||||
|
metadataProvider, |
||||
|
new Dictionary<string, string>() |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public enum MyEnum |
||||
|
{ |
||||
|
Value1 = 1 |
||||
|
} |
||||
|
|
||||
|
public class MyModel |
||||
|
{ |
||||
|
public MyEnum Value { get; set; } |
||||
|
} |
||||
|
|
||||
|
private class TestStringLocalizer : IStringLocalizer |
||||
|
{ |
||||
|
public LocalizedString this[string name] => new(name, "Localized:" + name); |
||||
|
|
||||
|
public LocalizedString this[string name, params object[] arguments] => new(name, "Localized:" + name); |
||||
|
|
||||
|
public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures) |
||||
|
{ |
||||
|
return new List<LocalizedString>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue