2013-07-04 14 views
8

Im Moment habe ich ein Attribut benutzerdefinierte Validierung ExistingFileName (unten), aber ich habe es Fehlermeldungen genannt gegebenWie Anpassung Validierungsattribut Fehlermeldung?

protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) 
    { 
     if (value!=null) 
     { 
      string fileName = value.ToString(); 
      if (FileExists(fileName)) 
      { 
       return new ValidationResult("Sorry but there is already an image with this name please rename your image"); 
      } 
      else 
      { 
       return ValidationResult.Success; 
      } 
     } 
     else 
     { 
      return new ValidationResult("Please enter a name for your image"); 
     } 
    } 

ich es wie so umgesetzt haben, angezeigt werden:

[ExistingFileName] 
public string NameOfImage { get; set; } 

im theres sicher eine Möglichkeit, die Fehlermeldung zu definieren, wenn das Attribut wie unter Einstellung:

[ExistingFileName(errormessage="Blah blah blah")] 
public string NameOfImage { get; set; } 

Aber ich bin nicht sicher, wie? Jede Hilfe ist sehr

geschätzt

Antwort

13

Statt ValidationResult mit einer vordefinierten Zeichenfolge Rückkehr versuchen, die ErrorMessage Eigenschaft verwenden, oder andere benutzerdefinierte Eigenschaften. Zum Beispiel:

private const string DefaultFileNotFoundMessage = 
    "Sorry but there is already an image with this name please rename your image"; 

private const string DefaultErrorMessage = 
    "Please enter a name for your image"; 

public string FileNotFoundMessage { get; set; } 

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    if (value!=null) 
    { 
     string fileName = value.ToString(); 
     if (FileExists(fileName)) 
     { 
      return new ValidationResult(FileNotFoundMessage ?? 
             DefaultFileNotFoundMessage); 
     } 
     else 
     { 
      return ValidationResult.Success; 
     } 
    } 
    else 
    { 
     return new ValidationResult(ErrorMessage ?? 
            DefaultErrorMessage); 
    } 
} 

Und in Ihrer Anmerkung:

[ExistingFileName(FileNotFoundMessage = "Uh oh! Not Found!")] 
public string NameOfImage { get; set; } 

Wenn Sie nicht explizit eine benutzerdefinierte Nachricht gesetzt ist, wird es auf die vordefinierte Konstante in Ihrem benutzerdefinierten Attribute Rückfall.

3

Haben Sie von ValidationAttribute geerbt?

dann müssen Sie es nicht in einer separaten Variable zu halten. Der gesamte Fehlermeldungscode ist verfügbar, wenn Sie von der Klasse ValidationAttribute erben.

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class ExistingFileNameAttribute : ValidationAttribute 
{ 
    public string FileFoundMessage = "Sorry but there is already an image with this name please rename your image"; 
    public ExistingFileNameAttribute() 
     : base("Please enter a name for your image") 
    {    
    } 

    public override ValidationResult IsValid(object value) 
    { 
     if (value!=null) 
     { 
      string fileName = value.ToString(); 
      if (FileExists(fileName)) 
      { 
       return new ValidationResult(FileFoundMessage); 
      } 
      else 
      { 
       return ValidationResult.Success; 
      } 
     } 
     else 
     { 
      return new ValidationResult(ErrorMessage); 
     } 
    } 
} 

Jetzt können Sie diese verwenden, um Ihre Felder/Eigenschaften

[ExistingFileName(ErrorMessage="Blah blah blah", FileFoundMessage = "Blah Bla")] 
public string NameOfImage { get; set; } 

zu überprüfen und, wenn Sie es wie unten verwenden.

[ExistingFileName] 
public string NameOfImage { get; set; } 

dann wird es die Standard-Fehlermeldung im Konstruktor der

Attribut ExistingFileName gesetzt verwenden

Hoffnung, das hilft.

+0

Viele, danke dafür. –

+0

Ihre 'IsValid' soll ein bool zurück, aber Sie Zurückgeben eines' ValidationResult'. Ist das richtig? Ich kann das nicht zur Arbeit bringen, und ich kann 'IsValid' nicht überschreiben, um ein' ValidationResult' zurückzugeben. – muttley91

+0

Vielen Dank für den Hinweis, der Rückgabetyp muss ValidationResult sein – Amila