c# - 未翻译所需的数据注释

标签 c# asp.net asp.net-mvc validation data-annotations

我们在 Required 属性的本地化方面遇到了一个奇怪的错误。

我们有以下代码:

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

问题是“RequiredMessage”的正确翻译没有从资源文件中提取,尽管它存在(我们在西类牙语和俄语资源文件上都有 RequiredMessage)。

像 Display 这样的属性正在工作并且正在被翻译,但似乎是 Required 属性的问题。

这是一个示例图片:

Labels are translated to russian, but required message is in spanish

错误显示为@Html.ValidationMessage

预先感谢您的帮助。

最佳答案

我将从在 web.config 中设置全局化元素开始

<system.web>
  <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>

接下来我将检查您在 Controller 中获得的文化(将其记录在数据库中或使用 @ViewBag

传递给 View
culture = CultureInfo.InstalledUICulture.IetfLanguageTag;
if (HttpContext.Current != null && HttpContext.Current.Request.UserLanguages != null)
{
    culture = Request.UserLanguages[0];     
}

确认您用于标识文化的值是标题所使用的值


跟进

您正在使用全局化 header 检查用户语言,但在浏览器中手动设置用户语言。

2 种尝试方法:

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

<script type="text/javascript"> 
     Globalize.culture("@ViewBag.Culture");
</script>

或者如果在 Javascript 中设置区域性(相对于 C#)

<script type="text/javascript"> 
     Globalize.culture(culturevariable);
</script>

2) ParameterisedRequiredAttribute

public class ParameterisedRequiredAttribute : RequiredAttribute
{
    private string[] _replacements { get; set; }

    public ParameterisedRequiredAttribute(params string[] replacements)
    {
        _replacements = replacements;

        ErrorMessageResourceName = ErrorMessagesErrors.SpecificFieldRequired;
        ErrorMessageResourceType = typeof(ErrorMessages);
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, (object[])_replacements);
    }
}

如果您手动设置语言,第一种方法似乎是更好的解决方案。简而言之,每次用户更改语言模式时都必须重新设置注释。

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

关于c# - 未翻译所需的数据注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29743401/

相关文章:

c# - 如何从 C#/WPF 项目调用 C++ DLL

asp.net - 尝试通过 IP 地址保护文件夹中的所有 aspx 文件

C# - 跳过最后 X 行的 Linq 语句

ajax - IIS 的奇怪 AJAX 重定向 401 问题

asp.net - 从 umbraco 4 迁移到 umbraco 5

jquery - 在mvc中实现部分 View 分页的最佳方式

c# - 无法将数据发布到 UAT 服务器中的 Salesforce

c# - 模拟 ApplicationUser 并提供角色

C# 响应式(Reactive)扩展 - 内存管理和 Distinct 运算符

asp.net - 寻找 ASP.NET 详细表单中的数据绑定(bind)指南