I eu ce problème pendant un certain temps, puis je me suis rendu compte que les validateurs d'un ne pas pour faire l'attribut ou les éléments requis, ils sont pour les valider.
Pour rendre une propriété obligatoire, vous devez utiliser les propriétés IsRequired et ConfigrationPropertyOptions.IsRequired, par ex.
[ConfigurationProperty("casLogoutUrl", DefaultValue = null, IsRequired = true, Options = ConfigurationPropertyOptions.IsRequired)]
[StringValidator(MinLength=10)]
Ou (si vous utilisez l'api)
ConfigurationProperty casLoginUrl = new ConfigurationProperty("casLoginUrl", typeof(string), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired);
Faire cela, le cadre de la configuration se chargera de la propriété elle-même étant nécessaire, et le validateur poignées de valider ce qui est de la valeur. Les validateurs ne sont pas destinés à rendre quelque chose nécessaire.
Cela fonctionne également sur les éléments pour rendre les éléments enfants requis. Par exemple. si vous créez une ConfigSection personnalisée avec des éléments enfants et que vous avez besoin d'un élément enfant. Toutefois, si vous créez un CustomValidator qui hérite de ConfigurationValidatorBase, vous devez utiliser ElementInformation.IsPresent, par exemple.
public override void Validate(object value)
{
CredentialConfigurationElement element = (CredentialConfigurationElement)value;
if (!element.ElementInformation.IsPresent)
return; //IsRequired is handle by the framework, don't throw error here only throw an error if the element is present and it fails validation.
if (string.IsNullOrEmpty(element.UserName) || string.IsNullOrEmpty(element.Password))
throw new ConfigurationErrorsException("The restCredentials element is missing one or more required Attribute: userName or password.");
}
Longue histoire courte, il vous manque les options partie de votre attribut pour le rendre nécessaire et ne doit pas utiliser StringValidator (MinLength = 1) pour le rendre nécessaire. En fait, StringValidator (MinLength = 1) est complètement redondant.Si vous le faites requis, il est impossible que MinLength = 1 échoue sans que le défaut Required échoue en premier, car s'il est présent, il est garanti qu'il aura au moins 1 caractère.
Changer votre validateur
[ConfigurationProperty("appCode", IsRequired = true, Options=ConfigurationPropertyOptions.IsRequired)]
fossé Puis la chaîne validateur.
J'ai lu que série, malheureusement, il n'explique pas pourquoi je reçois l'erreur. –
Avez-vous essayé d'initialiser la propriété ApplicationCode avec une valeur par défaut (valide)? Il semble que la règle de validation échoue à un moment donné avant que la valeur ne soit lue dans le fichier de configuration. – Shackles
Oui, et cela fonctionne très bien avec les valeurs par défaut. Cependant, tous les champs n'ont pas de valeurs par défaut valides/raisonnables, en particulier celles facultatives, donc c'est ennuyeux qu'il ne semble pas pouvoir s'initialiser à partir de la configuration. –