C# 未转换所需的数据批注

C# 未转换所需的数据批注,c#,asp.net,asp.net-mvc,validation,data-annotations,C#,Asp.net,Asp.net Mvc,Validation,Data Annotations,我们面临着一个奇怪的错误,即必需属性的本地化 我们有以下代码: public class AnswersGroupViewModel { public int IDAnswerGroup { get; set; } public int IDEvaluator { get; set; } public List<AnswersViewModel> Answers { get; set; } } publ

我们面临着一个奇怪的错误,即必需属性的本地化

我们有以下代码:

    public class AnswersGroupViewModel
    {
        public int IDAnswerGroup { get; set; }
        public int IDEvaluator { get; set; }
        public List<AnswersViewModel> Answers { get; set; }
    }

    public class AnswersViewModel
    {        
        public string Text{ get; set; }      
        [Required(ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof(Resources.Language))]
        public int IDAnswer{ get; set; }
    }
公共类应答器组视图模型
{
公共int IDAnswerGroup{get;set;}
公共int-ideevaluator{get;set;}
公共列表答案{get;set;}
}
公共类应答器VIEWMODEL
{        
公共字符串文本{get;set;}
[必需(ErrorMessageResourceName=“RequiredMessage”,ErrorMessageResourceType=typeof(Resources.Language))]
公共int IDAnswer{get;set;}
}
问题是“RequiredMessage”的正确翻译没有从资源文件中获取,尽管它存在(我们在西班牙语和俄语资源文件中都有RequiredMessage)

像Display这样的属性正在工作并被转换,但对于必需的属性来说似乎是个问题

下面是一个示例图像:

错误显示为@Html.ValidationMessage


提前感谢您的帮助。

我将首先在web.config中设置全球化元素

<system.web>
  <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>
确认用于标识区域性的值是标头使用的值


改善效果追踪 您正在使用全球化标题检查用户语言,但正在浏览器中手动设置用户语言

2种尝试方法:

1)使用Javascript在浏览器中设置用户语言:

<script type="text/javascript"> 
     Globalize.culture("@ViewBag.Culture");
</script>
如果手动设置语言,第一种方法似乎是更好的解决方案。简单地说,每次用户更改语言模式时都必须重新设置注释


另一个要考虑的是,你当前设置语言的方式(通过标题)可能是你最好的解决方案。虽然这很难测试,因为您需要使用专用语言的客户端,但这是区分用户的最佳方式(通过标题)。

确保您当前的线程上下文已更新,以便根据web客户端的请求标题使用正确的CultureInfo。如果定义了
标记,则这应该是自动的。否则,请添加筛选器以拦截请求并执行更新

var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

另请参见

为了重现您的问题,我创建了一个示例应用程序。它适合我,所以我会给你我的当前设置

我有一个引用库程序集资源的Web应用程序项目

我在资源项目中有2个resx文件(language.resx和language.fr.resx)。两个文件具有相同的属性:

  • 构建操作:嵌入式资源
  • 自定义工具:PublicResXFileCodeGenerator
  • 自定义工具名称空间:MyResources
ViewModel AnswersViewModel具有具有以下属性的IDAnswer属性:

[Required(ErrorMessageResourceName = "RequiredMessage", 
          ErrorMessageResourceType = typeof(MyResources.Language))]
我已将名称空间MyResource添加到视图文件夹中的web.config文件中,并通过添加

<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>


我希望这会有所帮助。

您的翻译看起来像“请输入{0}”吗?显然,请输入将是俄语或其他语言,我是问你是否包括{0}。在本例中不是。只有一条消息指出该字段是必需的。该问题是否只涉及客户端验证或服务器端验证,或两者都涉及?验证在服务器上执行。ModelState.IsValid为false,因此返回到Viewnot技术上为true。验证是在服务器上配置的,但它是在客户端和可选的模型检查上实施的。我们在Web.config上已经有了这一行。但我们的产品线略有不同。我们在标签“culture”和“uiCulture”上有“auto:es”。@rubenfa,尝试将
uiCulture
的标签改为“auto”。如果这不起作用,我们可以创建一个自定义属性。Upss,你是对的。控制器上的区域性始终为“es”。若我在web.config上将uiCulture设置为“ru”,则会翻译错误消息。与自动不起作用。我们正在用它来改变语言,似乎问题就在那里。@rubenfa,试试这个黑客,看看它是否改变了任何东西
Globalize.culture(“”)
@rubenfa,我怀疑问题出在你得到的标题中。当您选中
Request.UserLanguages
时,您正在从请求者的浏览器中检查请求标题。只是好奇,您是否尝试过设置
uiCulture=“auto”
var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
[Required(ErrorMessageResourceName = "RequiredMessage", 
          ErrorMessageResourceType = typeof(MyResources.Language))]
<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>