Automatically localize display name for model properties (without Display attribute).

pull/400/head
Halil ibrahim Kalkan 7 years ago
parent 118e674342
commit 1913ced92e

@ -0,0 +1,50 @@
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Microsoft.AspNetCore.Mvc.DataAnnotations;
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
namespace Volo.Abp.AspNetCore.Mvc
{
public class AbpDataAnnotationAutoLocalizationMetadataDetailsProvider : IDisplayMetadataProvider
{
private readonly Lazy<IStringLocalizerFactory> _stringLocalizerFactory;
private readonly Lazy<IOptions<MvcDataAnnotationsLocalizationOptions>> _localizationOptions;
public AbpDataAnnotationAutoLocalizationMetadataDetailsProvider(IServiceCollection services)
{
_stringLocalizerFactory = services.GetRequiredServiceLazy<IStringLocalizerFactory>();
_localizationOptions = services.GetRequiredServiceLazy<IOptions<MvcDataAnnotationsLocalizationOptions>>();
}
public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
{
var displayMetadata = context.DisplayMetadata;
if (displayMetadata.DisplayName != null)
{
return;
}
var attributes = context.Attributes;
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
var displayNameAttribute = attributes.OfType<DisplayNameAttribute>().FirstOrDefault();
if (displayAttribute != null || displayNameAttribute != null)
{
return;
}
var containerType = context.Key.ContainerType ?? context.Key.ModelType;
var localizer = _localizationOptions.Value.Value.DataAnnotationLocalizerProvider(containerType, _stringLocalizerFactory.Value);
if (context.Key.Name == "BirthDate")
{
displayMetadata.DisplayName = () => localizer[context.Key.Name];
}
}
}
}

@ -15,6 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc
AddConventions(options, services);
AddFilters(options);
AddModelBinders(options);
AddMetadataProviders(options, services);
}
private static void AddConventions(MvcOptions options, IServiceCollection services)
@ -34,5 +35,12 @@ namespace Volo.Abp.AspNetCore.Mvc
{
//options.ModelBinderProviders.Add(new AbpDateTimeModelBinderProvider());
}
private static void AddMetadataProviders(MvcOptions options, IServiceCollection services)
{
options.ModelMetadataDetailsProviders.Add(
new AbpDataAnnotationAutoLocalizationMetadataDetailsProvider(services)
);
}
}
}

@ -19,7 +19,7 @@ namespace Volo.Abp.AspNetCore.App
public class PersonModel
{
[Display(Name = nameof(BirthDate))]
//[Display(Name = nameof(BirthDate))]
public string BirthDate { get; set; }
public PersonModel()

Loading…
Cancel
Save