C#/.Net TryValidateObject - 如何本地化

本文关键字:本地化 TryValidateObject Net | 更新日期: 2023-09-27 18:30:15

我试图获得一个非常简单的控制台应用程序,以便在我的对象上与本地化和TryValidateObject一起使用。

我有一个学生班:

 public class Student
    {
        [Display(ResourceType = typeof(Strings), Name = @"Student_Name_DisplayName")]
        [Required]
        public string Name {get; set;}
    }

我有一个公共资源 Strings.resx 用于我的默认语言(英语),具有

Key = Student_Name_DisplayName
Value = Name

我有一个西班牙语的内部资源文件 Strings.es.resx

Key = Student_Name_DisplayName
Value = Nombre

如果我创建一个新的 Student 对象并且没有将 Name 属性设置为某些内容,则我希望在调用 Validator.TryValidateObject 时看到错误。我愿意。

将当前区域性和 UI 区域性设置为英语,我收到验证错误:"名称字段为必填字段。"

将当前区域性和 UI 区域性设置为西班牙语,我收到验证错误:"诺布雷领域是必需的。"

非常接近,但我希望消息的其余部分也是西班牙语。

我发现在Silverlight中这样做是有效的 - Silveright以某种方式"看到"了正确的语言并得到了正确的错误。 但是,我有一些服务器端处理,我也想返回正确的翻译字符串。

完整代码如下:

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Student student  = new Student();
var validationResults = new Collection<ValidationResult>();
Validator.TryValidateObject(student, new ValidationContext(student, null, null), validationResults, true);
if (validationResults.Count > 0)
  Debug.WriteLine(validationResults[0].ErrorMessage);
//produces "The Name field is required"    
validationResults.Clear(); 
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("es");
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("es");
Student student2 = new Student();
Validator.TryValidateObject(student2, new ValidationContext(student2, null, null), validationResults, true);
if (validationResults.Count > 0)
  Debug.WriteLine(validationResults[0].ErrorMessage);
  //produces "The Nombre field is required"

思潮?

谢谢(格拉西亚斯)

C#/.Net TryValidateObject - 如何本地化

Silverlight似乎附带了所有本地化资源,但.NET框架没有。

尝试安装 .NET 语言包(适用于 .NET 4.5:http://www.microsoft.com/en-us/download/details.aspx?id=30667)

您需要

[Required] 属性的本地化属性指定值(例如 ErrorMessageResourceName )。

请参阅 http://haacked.com/archive/2009/12/11/localizing-aspnetmvc-validation.aspx

您需要使用这些行读取属性名称

var context = new ValidationContext(parseResult.ProductVM, serviceProvider: null, items: null);
List<ValidationResult> validationResults = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(parseResult.ProductVM, context, validationResults, true);
if (!isValid)
{
    string memberName = validationResults.FirstOrDefault().MemberNames.FirstOrDefault();
    string displayName = GeneralHelper.GetDisplayNameByMemberName<ViewModels.ProductVM>(memberName);
    string displayNameTranslated = resourceManager.GetString(displayName, MultiLangHelper.CurrentCultureInfo);   
}

然后继续在这里回答,从.resx文件中获取翻译后的名称/值

https://stackoverflow.com/a/64524358/1594274

**parseResult.ProductVM 是我的视图模型

**GetDisplayNameByMemberName在上面的链接中提到的其他答案中提到

**资源管理器

ResourceManager resourceManager = new System.Resources.ResourceManager(typeof(App_GlobalResources.Pages));