首先,您应该像这样将消息保存在资源文件中:
Resources/ErrorMessages.resx // default messages
Resources/ErrorMessages.fr.resx // for french
在服务器端,这很容易,您可以通过向模型添加属性来实现。这样做:
[Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "FieldRequired")]
其中 "FieldRequired" 是 Resources.ErrorMessages
中的字段之一
棘手的部分是您希望客户端验证也能正常工作。比您必须创建自己的属性类,该类扩展 属性之一并且还实现 IClientValidatable。
你就是这样:
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
public override string FormatErrorMessage(string name)
{
return String.Format(ErrorMessages.FieldRequired, name);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRequiredRule(String.Format(ErrorMessages.FieldRequired, metadata.DisplayName));
return new[] { rule };
}
}
从现在开始,您将在模型中使用 CustomRequired 而不是 Required。您也不必每次都指定消息。
编辑
现在我看到了您对 SynerCoder 答案的评论 - 您不想自己翻译消息。好吧,我认为这不是正确的方法。即使您找到可以为您翻译标准消息的内容,它也不会翻译任何自定义消息,因此您最终可能会混合使用两种方法。这通常会导致你不知道如何咬的魔法错误。我强烈建议您自己进行翻译(这并不多 - 大约 20 个?)。好处是没有意外错误的灵活解决方案。