2016-07-19 21 views
1

Innenklasse, die für die Validierung verantwortlich ist habe ich einfache Regel:FluentValidation ändert Fehlermeldung in Must Funktion

RuleFor(u => u.Id) 
    .Cascade(CascadeMode.StopOnFirstFailure) 
    .NotEmpty().WithMessage("Id is required") 
    .Must(ValidateId); 

und unten ist meine ValidateId Funktion:

private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context) 
{ 
    if (id=="test") 
    { 
     context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing"); 
     return false; 
    } 

    var idValid = IdValidator.IsValid(id); 
    if (!idValid) 
    { 
     context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid"); 
     return false; 
    } 
    return true; 
} 

Wenn ich meinen Validator laufen bekomme ich Standardfehler, nicht meine benutzerdefinierten Fehler, die ich in meiner Funktion festlege.
Ich habe versucht Einstellung mit ihnen:

context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid"); 

aber ohne Erfolg.

Wie kann ich Fehlermeldung innerhalb der Validierungsfunktion definieren?

+0

@ AlekseyL.sorry für solche späten Antwort. Ich habe eine Erweiterung erstellt, mit der ich für jede Regel 'OnFailure' aufrufen kann. Ich habe meinen Code in FluentValidation Repo veröffentlicht (https://github.com/JeremySkinner/FluentValidation/issues/299#issuecomment-233904267) und ich warte auf Jeremy Review. Ich habe diese Lösung in meinem Projekt implementiert und es funktioniert gut, aber ich würde gerne Autor Review dazu bekommen, bevor ich es hier poste. Vielleicht könntest du es dir anschauen? – Misiu

+0

Ich denke, das ist nicht im Zusammenhang mit dieser Frage .. –

+0

@AlekseyL. Das tut mir leid. Ich habe Fragen falsch verstanden. Dieser Link ist verwandt mit http://stackoverflow.com/questions/38436630/fluentvalidation-logonfailure-override – Misiu

Antwort

1

können Sie Fehlermeldung definieren mit MessageBuilder:

if (id == "test") 
{ 
    context.Rule.MessageBuilder = c => "You are testing"; 
    return false; 
} 
+0

Danke, das funktioniert gut :) – Misiu

1

Ich würde nicht umsetzen, was Sie mit einer benutzerdefinierten Validierungsfunktion zu tun, wie Sie es FluentValidation selbst verwenden, können Sie versuchen:

RuleFor(u => u.Id) 
.Cascade(CascadeMode.StopOnFirstFailure) 
.Must(x => x !="test").WithMessage("You are testing.") 
.Must(x => IdValidator.IsValid(x)).WithMessage("Id is invalid."); 
+0

Ich werde das versuchen, aber innerhalb meiner benutzerdefinierten Validierungsfunktion habe ich mehr Logik, einschließlich Protokollierung und Datenbankzugriff, bo ich würde toll, wenn ich diese Fehlermeldung von meiner benutzerdefinierten Funktion einstellen könnte. – Misiu