Nhìn qua Breeze Tôi đã rất ấn tượng với nhiều tính năng của nó.Xác thực phía máy chủ Breeze
Tôi gặp sự cố khi tìm hiểu cách nhận các lỗi xác thực DbContext phía máy chủ quay lại máy khách. Tôi hiểu rằng Breeze có trình xác nhận mặc định phản ứng với một vài thuộc tính như "Bắt buộc", nhưng còn tất cả các thuộc tính khác thì sao? Tôi có thể viết trình xác nhận javascript tùy chỉnh cho Breeze để kiểm tra phía máy khách, nhưng tôi cũng cần kiểm tra để đảm bảo thực thể hợp lệ ở phía máy chủ.
Ví dụ: Ứng dụng yêu cầu "Người" để có địa chỉ Email hợp lệ. Người dùng độc hại xuất hiện và nhận địa chỉ email qua ứng dụng khách và bài đăng tới máy chủ có ngày không vượt qua trình xác thực "EmailAddress". Vì vậy, đến nay kinh nghiệm của tôi với Breeze là địa chỉ email sẽ tiết kiệm và không bong bóng lên bất kỳ lỗi DbContext/Entity Framework.
Giả sử mô hình bên dưới, cách tốt nhất để nhận bất kỳ lỗi xác thực đối tượng nào?
public class PeopleContext : DbContext
{
public PeopleContext()
: base("name=ConnectionString"){ }
public DbSet<Person> People { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[EmailAddress]
[Required]
public string Email { get; set; }
}
UPDATE 1:
Dưới đây là một số hướng dẫn để tái tạo các vấn đề mà tôi đang trải qua.
- theo hướng dẫn để tạo ra các "Todo" sample (http://www.breezejs.com/documentation/start-nuget)
Thêm một validator tùy chỉnh mới cho BreezeSampleTodoItem.cs nộp
[AttributeUsage(AttributeTargets.Property)] public class CustomValidator : ValidationAttribute { public override Boolean IsValid(Object value) { string val = (string)value; if (!string.IsNullOrEmpty(val) && val == "Error") { ErrorMessage = "{0} equal the word 'Error'"; return false; } return true; } }
Trang trí lĩnh vực Mô tả với các tùy chỉnh mới trình xác thực:
[CustomValidator] public string Description { get; set; }
Thêm sử dụng phù hợp tất nhiên ("Hệ thống" và "System.ComponentModel.DataAnnotations").
- Chạy dự án.
- Trong một trong các trường mô tả, hãy nhập "Lỗi" và lưu.
Đây là nơi tôi mong đợi sẽ thấy lỗi xuất hiện thông qua gió hoặc thậm chí là "DbEntityValidationException" được ném từ Khung thực thể. Tôi đã thử trên 2 máy tính riêng biệt với cùng một kết quả. Thực thể lưu vào cơ sở dữ liệu như thể không có lỗi. Trong thực tế, nếu bạn đặt một điểm ngắt bất cứ nơi nào bên trong phương pháp IsValid của trình xác nhận tùy chỉnh, bạn sẽ thấy rằng nó thậm chí không được gọi.
Xin chào Ward, Cảm ơn bạn đã trả lời và dự án tuyệt vời! Tôi đã chỉnh sửa câu hỏi của mình để cung cấp ví dụ về cách nhân rộng vấn đề mà tôi đang gặp phải. Vấn đề tôi gặp phải là không có chú thích dữ liệu nào đang được đánh giá khi sử dụng phương thức EFContextProvider.SaveChanges (saveBundle). Tôi đã kéo xuống mã nguồn cho Breeze và nếu tôi thay đổi mã cho phương thức EFContextProvider.SaveChangesCore sử dụng ((DbContext) (đối tượng) Ngữ cảnh) .SaveChanges() thay vì ObjectContext.SaveChanges(), thì chú thích được đánh giá đúng. Nhưng tôi không muốn sửa đổi Nguồn. – adamlj
Một lưu ý nữa, tôi đã kiểm tra các phương pháp BeforeSave. Mối quan tâm của tôi là tôi chỉ có thể trả lại một bool. Đối với các lỗi xác nhận, cần có cách nào đó để nhận lại thông báo lỗi cho người dùng. – adamlj
Bạn nên ném một ngoại lệ bao gồm giải thích về sự thất bại, ví dụ: 'ném mới InvalidOperationException ("Không thể lưu thực thể loại không xác định"); 'Returning false chỉ yêu cầu ContextProvider bỏ qua thực thể đó trong quá trình lưu; nó không chấm dứt việc lưu! Xem phần "[Chặn phía máy chủ] (http: //www.breezejs.com/documentation/server-side-interception) "trang trong tài liệu. – Ward