I đã có vấn đề này trong một thời gian, sau đó tôi nhận ra rằng các nhà xác nhận không phải để tạo thuộc tính hoặc các phần tử được yêu cầu, chúng là để xác thực chúng.
Để yêu cầu bất động sản, bạn cần phải sử dụng IsRequired và ConfigrationPropertyOptions.IsRequired, ví dụ:
[ConfigurationProperty("casLogoutUrl", DefaultValue = null, IsRequired = true, Options = ConfigurationPropertyOptions.IsRequired)]
[StringValidator(MinLength=10)]
Hoặc (nếu sử dụng api)
ConfigurationProperty casLoginUrl = new ConfigurationProperty("casLoginUrl", typeof(string), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired);
Việc làm này, khuôn khổ cấu hình sẽ xử lý tài sản được yêu cầu riêng của mình, và validator handle xác nhận những gì trong các giá trị. Người xác thực không có nghĩa là làm một cái gì đó cần thiết.
Điều này cũng hoạt động trên các yếu tố để làm cho các yếu tố con được yêu cầu. Ví dụ. nếu bạn đang thực hiện một ConfigSection tùy chỉnh với các phần tử con và cần một phần tử con được yêu cầu. Tuy nhiên, nếu bạn tạo CustomValidator kế thừa từ ConfigurationValidatorBase, bạn cần sử dụng ElementInformation.IsPresent, ví dụ:
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.");
}
Ngắn câu chuyện, bạn thiếu phần tùy chọn thuộc tính để yêu cầu và không nên sử dụng StringValidator (MinLength = 1) để thực hiện yêu cầu. Trong thực tế StringValidator (MinLength = 1) là hoàn toàn dư thừa.Nếu bạn làm cho nó yêu cầu nó không thể cho MinLength = 1 thất bại mà không có yêu cầu thất bại đầu tiên bởi vì nếu nó có mặt, nó được đảm bảo dài ít nhất 1 ký tự.
Thay đổi validator của bạn để
[ConfigurationProperty("appCode", IsRequired = true, Options=ConfigurationPropertyOptions.IsRequired)]
Sau đó, mương chuỗi validator.
Tôi đã đọc rằng toàn bộ series, tiếc là nó không giải thích lý do tại sao tôi nhận được lỗi. –
Bạn đã thử khởi tạo thuộc tính ApplicationCode với giá trị mặc định (hợp lệ) chưa? Có vẻ như quy tắc xác nhận không thành công tại một số điểm trước khi giá trị được đọc từ tệp cấu hình. – Shackles
Có, và nó hoạt động tốt với các giá trị mặc định. Tuy nhiên, không phải tất cả các trường đều có mặc định hợp lệ/hợp lý, đặc biệt là các trường tùy chọn, vì vậy nó khó chịu vì nó không thể khởi tạo từ cấu hình. –