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

时间:2013-09-05 17:16:12

标签: c# .net localization attributes

我试图让一个非常简单的控制台应用程序在我的对象上使用本地化和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 for Spanish

Key = Student_Name_DisplayName
Value = Nombre

如果我创建一个新的Student对象并且没有将Name属性设置为某个东西,那么如果我调用Validator.TryValidateObject,我希望看到一个错误。我做。

将当前的Culture和UI Culture设置为英语,我收到验证错误: “名称字段是必需的。”

将当前的Culture和UI文化设置为西班牙语,我收到验证错误: “Nombre领域是必需的。”

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

我发现在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"

思考?

谢谢(格拉西亚斯)

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您需要使用以下几行来读取属性名称

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));