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