I ha avuto questo problema per un po ', poi ho capito che i validatori a non per rendere l'attributo o gli elementi richiesti, servono per convalidarli.
Per rendere necessaria una proprietà è necessario utilizzare IsRequired e ConfigrationPropertyOptions.IsRequired, ad es.
[ConfigurationProperty("casLogoutUrl", DefaultValue = null, IsRequired = true, Options = ConfigurationPropertyOptions.IsRequired)]
[StringValidator(MinLength=10)]
Oppure (se si utilizza l'API)
ConfigurationProperty casLoginUrl = new ConfigurationProperty("casLoginUrl", typeof(string), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired);
In questo modo, il quadro di configurazione si occuperà della proprietà di essere in sé necessaria, e il validatore maniglie convalidare ciò che è nel valore. I validatori non sono pensati per fare qualcosa richiesto.
Questo funziona anche sugli elementi per rendere necessari elementi figlio. Per esempio. se stai creando una ConfigSection personalizzata con elementi figlio e hai bisogno di un elemento figlio da richiedere. Tuttavia, se si crea un CustomValidator che eredita da ConfigurationValidatorBase, è necessario utilizzare ElementInformation.IsPresent, ad es.
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.");
}
Per farla breve, vi manca la parte opzioni del tuo attributo per renderlo obbligatorio e non deve usare StringValidator (minLength = 1) per renderlo necessario. Infatti StringValidator (MinLength = 1) è completamente ridondante.Se lo rendi necessario è impossibile che MinLength = 1 fallisca senza il Required Failing first perché se è presente, è garantito che sia lungo almeno 1 carattere.
Cambia il tuo validatore per
[ConfigurationProperty("appCode", IsRequired = true, Options=ConfigurationPropertyOptions.IsRequired)]
Poi fosso il validatore stringa.
Ho letto che tutta la serie, purtroppo non spiega il motivo per cui sto ricevendo l'errore. –
Hai provato a inizializzare la proprietà ApplicationCode con un valore predefinito (valido)? Sembra che la regola di validazione non riesca ad un certo punto prima che il valore venga letto dal file di configurazione. – Shackles
Sì, e funziona perfettamente con i valori predefiniti. Tuttavia, non tutti i campi hanno valori di default validi/ragionevoli, specialmente quelli opzionali, quindi è fastidioso che non riesca a inizializzarsi da configurazione. –