Как объединить строки ресурсов для сообщений об ошибках атрибута проверки?

Если бы у меня были сообщения об ошибках в атрибуте проверки, например:

  • Имя требуется
  • Требуется фамилия

а затем атрибут проверки следующим образом:

[Required(ErrorMessageResourceName = "Error_FirstNameRequired", ErrorMessageResourceType = typeof(Strings)] public string FirstName {get;set;} 

Я не хочу, чтобы перевод был сделан для каждого экземпляра этого. Есть ли способ комбинировать строки ресурсов в форматировании, например:

 [Required(ErrorMessage = string.Format("{0} {1}", Strings.Label_FirstName, Strings.Error_IsRequired))] public string FirstName {get;set;} 

Конечно, это не работает, потому что это должна быть постоянная времени компиляции. Но можно ли достичь этого, чтобы я мог строить локализованные строки и повторно использовать те, которые уже существуют? Я думал о создании пользовательских атрибутов, которые позволяют устанавливать дополнительные свойства и переопределять выводимое сообщение по умолчанию, но это было бы слишком много рефакторинга и своего рода kludgy imo.

Есть идеи?

Вы можете использовать форматирование в строках, определенных в ваших ресурсах. Когда вы используете {0} , как показано в FieldRequired , отображаемое имя будет вставлено, когда это возможно. В противном случае он вернется к названию свойства, как показано для MiddleName .

Пример:

Ресурсы:

Strings.resx
String.resx

Strings.nl.resx
Strings.nl.resx

Реализация:

 public class MyClass { [Display(ResourceType = typeof(Strings), Name = "FirstName")] [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Strings))] public string FirstName { get; set; } [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Strings))] public string MiddleName { get; set; } [Display(ResourceType = typeof(Strings), Name = "LastName")] [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Strings))] public string LastName { get; set; } // Validation errors for culture [en] would be: // "First name is a required field." // "MiddleName is a required field." // "Last name is a required field." // // Validation errors for culture [nl] would be: // "Voornaam is een benodigd veld." // "MiddleName is een benodigd veld." // "Achternaam is een benodigd veld." }