2013-03-04 21 views
10

in einer ASP.NET MVC 4 app, die LocalPasswordModel Klasse (in Models \ AccountModels.cs) sieht wie folgt aus:Substitution Argumente in ValidationAttribute.ErrorMessage

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

Der obige Code enthält zwei Substitutionsargumente in der Errormessage string:

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

Kann mir jemand sagen, wo die Werte kommen, die in dieser Zeichenfolge ersetzt werden? Gibt es allgemein eine offizielle Dokumentation, die beschreibt, wie die Parametersubstitution in diesem Kontext funktioniert?

Antwort

11

Für StringLengthAttribute kann die Nachrichtenkette 3 Argumente:

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

leider Diese Parameter scheinen nicht gut zu dokumentieren. Die Werte werden vom Attribut FormatErrorMessage jedes Validierungsattributs übergeben. Zum Beispiel .NET Reflector verwenden, hier ist das Verfahren von 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 }); 
} 

Es ist sicher davon ausgehen, dass dies nie, weil das ändern würde brechen jede App nur über das es verwendet.

+1

Beachten Sie, dass diese nicht in der richtigen Reihenfolge sind - '{0}' ist der Eigenschaftsname, '{1}' ist die * maximale * Länge und '{2}' ist die * minimale * Länge. (Siehe den Aufruf von String.Format im Codeblock.) – GalacticCowboy

+1

@GalacticCowboy danke, ich habe es behoben. Anscheinend hat jemand anderes meine Antwort vor langer Zeit bearbeitet und den falschen Text dort hineingelegt. – Eilon