2010-01-21 4 views
6

Ich habe eine Klasse die enthält folgende ConfigurationSection:Kann ich einen Bereich mit dem IntegerValidator-Attribut für eine benutzerdefinierte ConfigurationSection angeben?

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; } 
    } 
    } 
} 

ich folgendes in meine .config-Datei dann haben:

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

Wenn ich versuche, dann wird folgende Fehler ich diesen Konfigurationsabschnitt zu verwenden, erhalten :

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.

Wenn ich chan ge der IntegerValidator ein ExcludeRage = true hat, ich (natürlich) bekommen:

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

Wenn ich dann den Wert der Eigenschaft in der .config auf eine Zahl von mehr als 100, es funktioniert.

Wenn ich den Validator ändern, um nur eine MaxValue von 100 zu haben, funktioniert es, aber wird auch einen Wert von -1 akzeptieren.

Ist es möglich, die IntegerValidatorAttribute mit einem Bereich wie diesem zu verwenden?

bearbeiten

als issue by Microsoft Bestätigte hinzuzufügen.

+2

Der Microsoft-Link wurde heute mit einer Lösung aktualisiert. Wenn kein Standardwert angegeben ist, wird "0" als Standardwert verwendet. 0 liegt natürlich außerhalb des Bereichs von 1-100. Die "Lösung" besteht darin, dem ConfigurationProperty-Attribut einen DefaultValue = -Parameter mit einem Standardwert hinzuzufügen, der im Bereich liegt. Leider bedeutet dies, dass Sie einen Standardwert angeben, der möglicherweise nicht Ihren Vorstellungen entspricht. Ich habe dieses Problem auch. Froh bin ich über diese Frage gestolpert! – Skrud

Antwort

13

Als Skrud weist darauf hin, hat MS die connect Ausgabe aktualisiert:

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")] 

Dies bedeutet, dass die Eigenschaft einen Standardwert haben wird, aber ich weiß nicht wirklich sehen, dass als ein wichtiges Thema - wir sind Er sagt, dass er einen Wert haben sollte, der in einen "vernünftigen" Bereich fällt, und sollte bereit sein, einen vernünftigen Standard festzulegen.

+3

Das ist, was für mich gearbeitet hat. In meinem Fall wollte ich ausdrücklich verlangen, dass die Option in der Konfigurationsdatei angegeben wird, daher wollte ich keinen Standardwert festlegen. Es stellt sich jedoch heraus, dass, wenn Sie ein Feld nach Bedarf markieren, diese Tatsache Vorrang hat und der Standardwert nie tatsächlich _used_ verwendet wird, außer dass die Validierung nicht vorzeitig ausgelöst wird. Es ist ein wenig kontraintuitiv, aber es funktioniert. –

+0

Gut zu wissen William, danke –