2010-01-21 6 views
6

Ho una classe che contiene il seguente ConfigurationSection:Posso specificare un intervallo con l'attributo IntegerValidator su una configurazione personalizzata?

namespace DummyConsole { 
    class TestingComponentSettings: ConfigurationSection { 

    [ConfigurationProperty("waitForTimeSeconds", IsRequired=true)] 
    [IntegerValidator(MinValue = 1, MaxValue = 100, ExcludeRange = false)] 
    public int WaitForTimeSeconds 
    { 
     get { return (int)this["waitForTimeSeconds"]; } 
     set { this["waitForTimeSeconds"] = value; } 
    } 

    [ConfigurationProperty("loginPage", IsRequired = true, IsKey=false)] 
    public string LoginPage 
    { 
     get { return (string)this["loginPage"]; } 
     set { this["loginPage"] = value; } 
    } 
    } 
} 

Ho poi hanno la seguente nel mio file config:

<configSections> 
    <section name="TestingComponentSettings" 
      type="DummyConsole.TestingComponentSettings, DummyConsole"/> 
</configSections> 
<TestingComponentSettings waitForTimeSeconds="20" loginPage="myPage" /> 

Quando quindi si tenta di utilizzare questa sezione di configurazione ricevo il seguente errore :

var Testing = ConfigurationManager.GetSection("TestingComponentSettings") 
      as TestingComponentSettings; 

ConfigurationErrorsException was unhandled

The value for the property 'waitForTimeSeconds' is not valid. The error is: The value must be inside the range 1-100.

Se io chan ge il IntegerValidator di avere un ExcludeRage = true, I (ovviamente) ottenere:

ConfigurationErrorsException was unhandled

The value for the property 'waitForTimeSeconds' is not valid. The error is: The value must not be in the range 1-100

Se quindi modificare il valore della proprietà nel .config per un numero superiore a 100, funziona.

Se cambio il validatore per avere solo un MaxValue su 100 funziona, ma accetterà anche un valore di -1.

È possibile utilizzare IntegerValidatorAttribute con un intervallo come questo?

Modifica per aggiungere

Confermato come issue by Microsoft.

+2

Il collegamento Microsoft è stato aggiornato oggi con una soluzione. Apparentemente, se non viene specificato un valore predefinito, utilizza "0" come valore predefinito. 0 è, ovviamente, al di fuori dell'intervallo 1-100. La "soluzione" consiste nell'aggiungere un parametro DefaultValue = all'attributo ConfigurationProperty con un valore predefinito compreso nell'intervallo. Sfortunatamente questo significa che stai imponendo un valore predefinito che potrebbe non essere quello che vuoi/hai bisogno. Ho avuto questo problema anche io. Sono contento di aver imbattuto in questa domanda! – Skrud

risposta

13

Come Skrud punti fuori, MS hanno aggiornato il problema di connessione:

The reported issue is because of a quirk in how the configuration system handles validators. Each numeric configuration property has a default value - even if one is not specified. When a default is not specified the value 0 is used. In this example the configuration property ends up with a default value that is not in the valid range specified by the integer validator. As a result configuration parsing always fails.

To fix this, change the configuration property definition to include a default value that is within the range of 1 to 100:

[ConfigurationProperty("waitForTimeSeconds", IsRequired=true, 
         DefaultValue="10")] 

Ciò significa che la proprietà avrà un default, ma io in realtà non vedere che come una questione importante - siamo dicendo che dovrebbe avere un valore che rientra in un intervallo "ragionevole" e dovrebbe essere pronto a impostare un valore ragionevole.

+3

Questo è quello che ha funzionato per me. Nel mio caso, volevo specificamente richiedere che l'opzione fosse specificata nel file di configurazione, quindi non volevo impostare un valore predefinito. Tuttavia, si scopre che se si contrassegna un campo come richiesto, tale fatto ha la precedenza e il valore predefinito non è mai in realtà _uso_ tranne che per mantenere la convalida dall'invio prematuro. È un po 'contro-intuitivo, ma funziona. –

+0

Buono a sapersi, William, grazie –