Tôi muốn sử dụng các thuộc tính xác thực dữ liệu trong một thư viện, để bất kỳ người tiêu dùng nào của dữ liệu cũng có thể xác nhận nó mà không sử dụng một ModelBinder (ví dụ trong một ứng dụng bàn điều khiển). Tôi làm nó như thế nào?Làm cách nào để tôi có thể sử dụng Thuộc tính xác thực dữ liệu trong C# trong ngữ cảnh non -ASP.net?
Làm cách nào để tôi có thể sử dụng Thuộc tính xác thực dữ liệu trong C# trong ngữ cảnh non -ASP.net?
Trả lời
Thực ra điều này khá thú vị. Gần đây, tôi đã sử dụng nó trong một triển khai xác thực WFP. Hầu hết mọi người đều viết rất nhiều mã bằng cách sử dụng sự phản chiếu để lặp lại các thuộc tính, nhưng có một hàm dựng sẵn cho việc này.
var vc = new ValidationContext(myObject, null, null);
return Validator.TryValidateObject(myObject, vc, null, true);
Bạn cũng có thể xác thực thuộc tính trên một thuộc tính được đặt tên. Bạn cũng có thể tùy ý chuyển vào danh sách để truy cập vào thông báo lỗi:
var results = new List<ValidationResult>();
var vc = new ValidationContext(myObject, null, null) { MemberName = "UserName"};
var isValid = Validator.TryValidateProperty(value, vc, results);
// get all the errors
var errors = Array.ConvertAll(results.ToArray(), o => o.ErrorMessage);
Các lớp System.ComponentModel.DataAnnotations.ValidationAttribute
có các phương thức IsValid
thực hiện logic xác thực. Họ lấy một đối tượng (giá trị của trường họ trang trí) và trả lại true
hoặc false
.
Bạn có thể sử dụng các thuộc tính này và phản ánh một chút để cuộn trình xác thực theo hướng của riêng bạn. Chuyển cho trình xác thực của bạn một đối tượng và trình xác thực sẽ nhận được danh sách PropertyInfo
s và FieldInfo
s. Đối với mỗi trong số này, nó có thể gọi GetCustomAttributes
để tìm kiếm những người được kế thừa từ ValidationAttribute
và đối với mỗi trong số này, hãy gọi IsValid
, chuyển giá trị của thuộc tính hoặc trường. Điều này có thể được thực hiện hoàn toàn tự động mà không biết cấu trúc của lớp được xác nhận tại thời điểm thiết kế.
Tôi có thể gọi 'TryValidateProperty' chuyển một thể hiện ngẫu nhiên' ValidationAttribute' để thực hiện không? – Shimmy
Tôi đã viết rất nhiều mã phản chiếu để làm điều này trong khi chờ đợi một câu trả lời: ( –
Có một số ví dụ đáng ngạc nhiên xung quanh việc sử dụng API này, và tải bằng cách sử dụng sự phản chiếu! – TheCodeKing
không phải là một lượng lớn các tham số đầu ra. ngoại lệ thay vì (không thể bỏ qua) –