Asp.net core aspnet核心中的DataAnnotations本地化

Asp.net core aspnet核心中的DataAnnotations本地化,asp.net-core,Asp.net Core,我在一个解决方案中有两个项目。其中一个名为UICORE,另一个名为DomainCore。UICore是一个包含我的控制器和视图的ASPNETCORE项目。 DomainCore是一个类库,它拥有我所有的实体类。我想使用本地化的数据注释。我学过“”但我不能让它为我工作 也许这会有帮助: 您需要将数据注释本地化添加到共享资源,并将其添加到每个控制器、视图和本地化响应的使用位置。如果域和视图模型的数据注释遇到了您的问题(或其中的一部分),我建议使用此方法 如果没有,不要投反对票。它可能对DataAn

我在一个解决方案中有两个项目。其中一个名为UICORE,另一个名为DomainCore。UICore是一个包含我的控制器和视图的ASPNETCORE项目。 DomainCore是一个类库,它拥有我所有的实体类。我想使用本地化的数据注释。我学过“”但我不能让它为我工作

也许这会有帮助:


您需要将数据注释本地化添加到共享资源,并将其添加到每个控制器、视图和本地化响应的使用位置。

如果域和视图模型的数据注释遇到了您的问题(或其中的一部分),我建议使用此方法

如果没有,不要投反对票。它可能对DataAnnotations标签有用

为了一次性编写DataAnnotation,请使用抽象类。在这个新实体的示例中,我将抽象类命名为NewMetaData

DomainCore项目:

namespace myProject.DomainCore
{
    public class New : NewMetaData
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public DateTime Date { get; set; }
    }

    public abstract class NewMetaData
    {
        [Required(ErrorMessage = "New Title is required")]
        [StringLength(maximumLength:150, ErrorMessage = "New Title length must not exceed 150 characters")]
        [Display(Name = "Title on New")]
        private string Title { get; set; }  //pay attention to privates

        [Required(ErrorMessage = "New Content is required")]
        [Display(Name = "Content of New")]
        private string Content { get; set; }

        [Required]
        [Display(Name = "Publish Date")]
        private DateTime Date { get; set; }        

    }
}
UICore项目中的viewmodel类也必须继承NewMetaData类:

namespace myProject.UICore.Models.News
{
    public class NewCreateModel: NewMetaData
    {
        public string Title { get; set; }
        [AllowHtml]
        public string Content { get; set; }
    }

    public class NewDetailsModel :NewMetaData
    {
        [HiddenInput(DisplayValue = false)]
        public Guid Id { get; set; }
        public string Url { get; set; }
        public string Title { get; set; }
        public string Content { get; set; } 
    }
}
如您所见,您可以向属性添加额外的DataAnotation,如AllowHtml、HiddenInput和。。。在UICore内部,仍然保持基本注释不变

这是对模型进行一次注释并多次使用的最简单的跨项目方法


希望有帮助。

您必须在启动文件中配置本地化,并添加DataAnnotations本地化选项

services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddViewLocalization(o=>o.ResourcesPath = "ResourcesFolder")
.AddDataAnnotationsLocalization(o=> {
    var type = typeof(MyResource);
    var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
    var factory = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
    var localizer = factory.Create("MyResource", assemblyName.Name);
    o.DataAnnotationLocalizerProvider = (t, f) => localizer;
})
等等

但是您仍然必须配置ModelBinding错误消息(例如:检查数字、空值等等)

在此示例中,所有本地化的标识错误消息都在名为LocalizedIdentityErrorMessages的资源文件中提供,并带有公共访问修饰符

您可以查看这些关于本地化的文章,其中包含GitHub上的实时演示和示例项目

开发多文化web应用程序:

本地化数据批注:

本地化标识错误消息:

本地化ModelBinding错误消息:

客户端验证:

[Required(ErrorMessage= "...")]
[StringLength(ErrorMessage= "...")]
[Range(ErrorMessage= "...")]
services.AddMvc()
.AddMvcOptions(o =>
        {
            var type = typeof(MyResource);
            var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
            var factory = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
            var localizer = factory.Create("MyResource", assemblyName.Name);

            o.ModelBindingMessageProvider
                .SetAttemptedValueIsInvalidAccessor((x, y) => localizer["'{0}' is not a valid value for '{1}'", x, y]);

            o.ModelBindingMessageProvider
                .SetValueMustBeANumberAccessor((x) => localizer["'{0}' must be a number.", x]);
        });
public class LocalizedIdentityErrorDescriber : IdentityErrorDescriber
{
    public override IdentityError DuplicateEmail(string email)
    {
        return new IdentityError
        {
            Code = nameof(DuplicateEmail),
            Description = string.Format(LocalizedIdentityErrorMessages.DuplicateEmail, email)
        };
    }

    public override IdentityError DuplicateUserName(string userName)
    {
        return new IdentityError
        {
            Code = nameof(DuplicateUserName),
            Description = string.Format(LocalizedIdentityErrorMessages.DuplicateUserName, userName)
        };
    }

    public override IdentityError InvalidEmail(string email)
    {
        return new IdentityError
        {
            Code = nameof(InvalidEmail),
            Description = string.Format(LocalizedIdentityErrorMessages.InvalidEmail, email)
        };
    }

    public override IdentityError DuplicateRoleName(string role)
    {
        return new IdentityError
        {
            Code = nameof(DuplicateRoleName),
            Description = string.Format(LocalizedIdentityErrorMessages.DuplicateRoleName, role)
        };
    }

    public override IdentityError InvalidRoleName(string role)
    {
        return new IdentityError
        {
            Code = nameof(InvalidRoleName),
            Description = string.Format(LocalizedIdentityErrorMessages.InvalidRoleName, role)
        };
    }

    public override IdentityError InvalidToken()
    {
        return new IdentityError
        {
            Code = nameof(InvalidToken),
            Description = LocalizedIdentityErrorMessages.InvalidToken
        };
    }

    public override IdentityError InvalidUserName(string userName)
    {
        return new IdentityError
        {
            Code = nameof(InvalidUserName),
            Description = string.Format(LocalizedIdentityErrorMessages.InvalidUserName, userName)
        };
    }

    public override IdentityError LoginAlreadyAssociated()
    {
        return new IdentityError
        {
            Code = nameof(LoginAlreadyAssociated),
            Description = LocalizedIdentityErrorMessages.LoginAlreadyAssociated
        };
    }

    public override IdentityError PasswordMismatch()
    {
        return new IdentityError
        {
            Code = nameof(PasswordMismatch),
            Description = LocalizedIdentityErrorMessages.PasswordMismatch
        };
    }

    public override IdentityError PasswordRequiresDigit()
    {
        return new IdentityError
        {
            Code = nameof(PasswordRequiresDigit),
            Description = LocalizedIdentityErrorMessages.PasswordRequiresDigit
        };
    }

    public override IdentityError PasswordRequiresLower()
    {
        return new IdentityError
        {
            Code = nameof(PasswordRequiresLower),
            Description = LocalizedIdentityErrorMessages.PasswordRequiresLower
        };
    }

    public override IdentityError PasswordRequiresNonAlphanumeric()
    {
        return new IdentityError
        {
            Code = nameof(PasswordRequiresNonAlphanumeric),
            Description = LocalizedIdentityErrorMessages.PasswordRequiresNonAlphanumeric
        };
    }

    public override IdentityError PasswordRequiresUniqueChars(int uniqueChars)
    {
        return new IdentityError
        {
            Code = nameof(PasswordRequiresUniqueChars),
            Description = string.Format(LocalizedIdentityErrorMessages.PasswordRequiresUniqueChars, uniqueChars)
        };
    }

    public override IdentityError PasswordRequiresUpper()
    {
        return new IdentityError
        {
            Code = nameof(PasswordRequiresUpper),
            Description = LocalizedIdentityErrorMessages.PasswordRequiresUpper
        };
    }

    public override IdentityError PasswordTooShort(int length)
    {
        return new IdentityError
        {
            Code = nameof(PasswordTooShort),
            Description = string.Format(LocalizedIdentityErrorMessages.PasswordTooShort, length)
        };
    }

    public override IdentityError UserAlreadyHasPassword()
    {
        return new IdentityError
        {
            Code = nameof(UserAlreadyHasPassword),
            Description = LocalizedIdentityErrorMessages.UserAlreadyHasPassword
        };
    }

    public override IdentityError UserAlreadyInRole(string role)
    {
        return new IdentityError
        {
            Code = nameof(UserAlreadyInRole),
            Description = string.Format(LocalizedIdentityErrorMessages.UserAlreadyInRole, role)
        };
    }

    public override IdentityError UserNotInRole(string role)
    {
        return new IdentityError
        {
            Code = nameof(UserNotInRole),
            Description = string.Format(LocalizedIdentityErrorMessages.UserNotInRole, role)
        };
    }

    public override IdentityError UserLockoutNotEnabled()
    {
        return new IdentityError
        {
            Code = nameof(UserLockoutNotEnabled),
            Description = LocalizedIdentityErrorMessages.UserLockoutNotEnabled
        };
    }

    public override IdentityError RecoveryCodeRedemptionFailed()
    {
        return new IdentityError
        {
            Code = nameof(RecoveryCodeRedemptionFailed),
            Description = LocalizedIdentityErrorMessages.RecoveryCodeRedemptionFailed
        };
    }

    public override IdentityError ConcurrencyFailure()
    {
        return new IdentityError
        {
            Code = nameof(ConcurrencyFailure),
            Description = LocalizedIdentityErrorMessages.ConcurrencyFailure
        };
    }

    public override IdentityError DefaultError()
    {
        return new IdentityError
        {
            Code = nameof(DefaultError),
            Description = LocalizedIdentityErrorMessages.DefaultIdentityError
        };
    }
}