Аргументы замены в ValidationAttribute.ErrorMessage

В приложении ASP.NET MVC 4 класс LocalPasswordModel (в моделях \AccountModels.cs) выглядит следующим образом:

public class LocalPasswordModel
{
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm new password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

Приведенный выше код содержит два аргумента замены в строке ErrorMessage:

ErrorMessage = "The {0} must be at least {2} characters long."

Может ли кто-нибудь сказать мне, откуда берутся значения, которые подставляются в эту строку? В более общем плане, есть ли что-нибудь, приближающееся к официальной документации, описывающей, как работает подстановка параметров в этом контексте?

Ответ 1

Для StringLengthAttribute строка сообщения может принимать 3 аргумента:

{0} Property name
{1} Maximum length
{2} Minimum length

Эти параметры, к сожалению, не очень хорошо документированы. Значения передаются из каждого атрибута атрибута FormatErrorMessage. Например, используя .NET Reflector, вот этот метод из StringLengthAttribute:

public override string FormatErrorMessage(string name)
{
    EnsureLegalLengths();
    string format = ((this.MinimumLength != 0) && !base.CustomErrorMessageSet) ? DataAnnotationsResources.StringLengthAttribute_ValidationErrorIncludingMinimum : base.ErrorMessageString;
    return String.Format(CultureInfo.CurrentCulture, format, new object[] { name, MaximumLength, MinimumLength });
}

Можно с уверенностью предположить, что это никогда не изменится, потому что это сломает почти все приложения, которые его используют.