2010-01-21 38 views
6

Tôi có một lớp chứa sau ConfigurationSection:Tôi có thể chỉ định dải ô có thuộc tính IntegerValidator trên ConfigurationSection tùy chỉnh không?

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

sau đó tôi có những điều sau đây trong tập tin .config tôi:

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

Khi tôi sau đó cố gắng sử dụng phần cấu hình này, tôi nhận được lỗi sau :

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.

Nếu tôi chan ge IntegerValidator để có một ExcludeRage = true, I (rõ ràng) nhận được:

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

Nếu tôi sau đó thay đổi giá trị của bất động sản trong .config một số cao hơn 100, nó hoạt động.

Nếu tôi thay đổi trình xác thực để chỉ có một số MaxValue của 100 nó hoạt động, nhưng cũng sẽ chấp nhận giá trị -1.

Có thể sử dụng IntegerValidatorAttribute với phạm vi như thế này không?

Chỉnh sửa để thêm

Xác nhận như một issue by Microsoft.

+2

Liên kết Microsoft đã được cập nhật hôm nay với giải pháp. Rõ ràng nếu một giá trị mặc định không được chỉ định, nó sử dụng "0" làm giá trị mặc định. 0, tất nhiên, nằm ngoài phạm vi 1-100. "Giải pháp" là thêm một tham số DefaultValue = vào thuộc tính ConfigurationProperty với giá trị mặc định nằm trong phạm vi. Thật không may điều này có nghĩa rằng bạn đang áp đặt một giá trị mặc định mà có thể không phải là những gì bạn muốn/cần. Tôi cũng gặp sự cố này. Rất vui khi tôi tình cờ gặp câu hỏi này! – Skrud

Trả lời

13

Như Skrud điểm ra, MS đã cập nhật các vấn đề kết nối:

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

này có nghĩa là tài sản sẽ có một mặc định, nhưng tôi không thực sự thấy đó như là một vấn đề lớn - chúng tôi nói rằng nó phải có giá trị nằm trong phạm vi "hợp lý" và cần được chuẩn bị để đặt mặc định hợp lý.

+3

Đây là những gì đã kết thúc với tôi. Trong trường hợp của tôi, tôi đặc biệt muốn yêu cầu tùy chọn được chỉ định trong tệp cấu hình, vì vậy tôi không muốn đặt giá trị mặc định. Nhưng, nó chỉ ra rằng nếu bạn đánh dấu một lĩnh vực theo yêu cầu thực tế được ưu tiên và giá trị mặc định là không bao giờ thực sự _used_ ngoại trừ để giữ cho xác nhận từ bắn sớm. Đó là một chút phản trực giác, nhưng nó hoạt động. –

+0

Tốt để biết William, cảm ơn –

Các vấn đề liên quan