I miałem ten problem przez jakiś czas, a potem zdałem sobie sprawę, że walidatory a nie należy do tego, aby atrybut lub elementy były wymagane, ale służą do ich sprawdzania.
Aby utworzyć wymaganą właściwość, należy użyć obiektów IsRequired i ConfigrationPropertyOptions.IsRequired, np.
[ConfigurationProperty("casLogoutUrl", DefaultValue = null, IsRequired = true, Options = ConfigurationPropertyOptions.IsRequired)]
[StringValidator(MinLength=10)]
albo (w przypadku korzystania z interfejsu API)
ConfigurationProperty casLoginUrl = new ConfigurationProperty("casLoginUrl", typeof(string), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired);
Spowoduje to, ramy konfiguracji zajmie właściwość jest wymagana siebie, a walidator uchwyty walidacji co do wartości. Walidatory nie są przeznaczone do robienia czegoś wymaganego.
Dotyczy to również elementów wymagających elementów potomnych. Na przykład. jeśli tworzysz niestandardową konfigurację z elementami podrzędnymi i potrzebujesz wymaganego elementu podrzędnego. Jednak jeśli tworzysz CustomValidator, który dziedziczy z ConfigurationValidatorBase, musisz użyć elementu ElementInformation.IsPresent, np.
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.");
}
Krótko mówiąc, brakuje opcjach część swojego atrybutu, aby to wymagane i nie powinno się używać StringValidator MINLENGTH (= 1), aby to wymagane. W rzeczywistości StringValidator (MinLength = 1) jest całkowicie nadmiarowy.Jeśli to zrobisz, nie będzie możliwe, aby MinLength = 1 zakończyło się niepowodzeniem bez wymaganego niepowodzenia, ponieważ jeśli jest obecny, ma przynajmniej 1 znak.
Zmień walidator do
[ConfigurationProperty("appCode", IsRequired = true, Options=ConfigurationPropertyOptions.IsRequired)]
Następnie rowu walidator ciąg.
Czytałem, że cała seria, niestety to nie wyjaśnia, dlaczego otrzymuję błąd. –
Czy próbowałeś zainicjować właściwość ApplicationCode z (poprawną) wartością domyślną? Wygląda na to, że reguła sprawdzania poprawności zawodzi w pewnym momencie, zanim wartość zostanie odczytana z pliku konfiguracyjnego. – Shackles
Tak, i działa poprawnie z domyślnymi ustawieniami. Jednak nie wszystkie pola mają poprawne/sensowne wartości domyślne, szczególnie opcjonalne, więc irytujące jest to, że nie można go zainicjować z konfiguracji. –