Programmatischer Validator

Für einen eigenen Validator muss ein Attribut implementiert werden, welches in den “Custom Attributes” des Feldes hinterlegt wird. Dort werden die Parameter und die Validierungsmethode definiert.

public class MyValidatorAttribute : ValidationAttribute
{
    public readonly string StartsWith;

    public MyValidatorAttribute(string startsWith) : base()
    {
        StartsWith = startsWith;
    }

    protected override ValidationResult IsValid(Object value, ValidationContext validationContext)
    {
        if (value == null)
            return ValidationResult.Success;

        ErrorMessage = "";
        if (value is string valueString)
        {
            if (!valueString.StartsWith(StartsWith))
            {
                ErrorMessage = "[INSERT TRANSLATION GUID]".Translate(StartsWith);
                return new ValidationResult(ErrorMessage, new String[] { validationContext.MemberName });
            }
        }

        return ValidationResult.Success;
    }
}

Steuerelement für den Validator

Auf Basis des Attributs kann man den Validator in der Konfiguration setzen. Dazu wird eine entsprechende Klasse implementiert. Die Eigenschaften der Klasse werden automatisiert als Felder im Designer angezeigt. Mit ShowInToolbox legt man fest ob der Konfigurator den Validator selbst auf beliebige Felder setzen kann.

[Serializable]
[Toolbox(EnumConfigurationType.OrmEntityConfigurationGuid, EnumConfigurationType.OrmSubEntityConfigurationGuid, ShowInToolbox = true)]
public class MyValidator : FieldValidatorBase
{
    // Kann in der Konfiguration gesetzt werden
    [DisplayName("Beginnt mit")]
    [HelpText("Erklärung von 'Beginnt mit'")]
    [PropertiesForm(5)]
    [BARequired] // Muss gefüllt werden. Ist selbst ein Validator Attribut.
    public string StartsWith { get; set; }

    public MyValidator()
    {
        Id = new Guid("[INSERT VALIDATOR GUID]");
        ToolboxName = "Beginnt mit";
        ControlInitName = "StartsWithValidator";
        ToolboxGroupName = Constants.Designer.ToolboxGroups.ORM.Validators;
        Icon = "spellcheck";
        DesignerHintText = "Erklärung des Validators";
    }

    // Definiert das dazugehörige Attribut
    public override ValidationAttribute GetValidationAttribute()
    {
        return new MyValidatorAttribute(StartsWith);
    }

    // Validiert das Konfigurationsobjekt
    public override List<ValidationModel> IsValid(ConfigurationBase configuration = null, EnumDesignerValidationState validationState = null)
    {
        List<ValidationModel> result = base.IsValid(configuration, validationState);

        if (!StartsWith.Length > 3)
            result.Add(new ValidationModel(nameof(StartsWith), this, "Feld muss mindestens vier Zeichen beinhalten."));

        return result;
    }
}

Attribut mit Steuerelement verknüpfen

Mit GetValidationAttribute() verknüpft man das Steuerelment mit dem Attribut. Möchte man das Attribut schon in der programmíerten Datentablle setzen und in diesem Fall das Steuerelement anzeigen, muss das Interface IDesignableValidator und die Methode CreateValidatorControl()* beim Attribut implementiert werden.

public class MyValidatorAttribute : ValidationAttribute, IDesignableValidator
public FieldValidatorBase CreateValidatorControl()
{
    return new MyValidator()
    {
        StartsWith = StartsWith,
    };
}

Drag & Drop

Man sollte die Drag & Drop Regeln beachten. Mit den beiden Klassen TextValidatorBase und GenericValidatorBase als Basisklasse des Validators, kann dies vereinfacht werden.

public class MyValidator : TextValidatorBase { }

Alternativ müssen die Regeln manuell gesetzt werden.

[assembly: DnDRule(typeof(OrmTextField), typeof(MyValidator), EnumConfigurationType.OrmEntityConfigurationGuid)]