2012-01-17 32 views
25

Tôi thích làm việc với cấu hình API thông thạo để DataAnnotation vì tôi muốn tách mô hình khỏi truy cập dữ liệu.Làm thế nào để làm cho cấu hình API thông thạo hoạt động với xác thực phía máy khách MVC?

Tôi đã thử trong MVC, API thông thạo không hoạt động với xác thực phía ứng dụng khách. Nói ngắn gọn, có cách nào đơn giản để làm cho API thông thạo hoạt động với xác thực phía máy khách như DataAnnotation có thể làm?

Trả lời

35

Không. API thông thạo chỉ là ánh xạ - chính xác. Chú thích dữ liệu vừa là ánh xạ vừa xác thực - sai. Chú thích dữ liệu là một trong những tính năng tồi tệ nhất của mã EF đầu tiên bởi vì khi được sử dụng theo cách này, chúng sẽ tồn tại lâu dài với logic trình bày và xác thực.

Lời khuyên: không sử dụng các thực thể EF để trình bày. Sử dụng các kiểu xem đặc biệt với chú thích dữ liệu và cho phép trình điều khiển của bạn chuẩn bị các mô hình xem từ các thực thể và ngược lại. Sớm hay muộn bạn sẽ tìm thấy các tình huống mà việc xác thực của bạn không phải là 1: 1 với ánh xạ của bạn hoặc nơi mà chế độ xem của bạn cần nhiều hoặc ít dữ liệu hơn so với được cung cấp trong loại thực thể. Sử dụng các mô hình xem và các tình huống này sẽ được xử lý bởi chúng.

+0

Tại sao EF thậm chí không cần ánh xạ như "HasMaxLength"? Nếu giá trị dài hơn, máy chủ SQL sẽ từ chối nó nếu viết được thử, và nó không quan trọng khi đọc vì kiểu 'chuỗi' không có giới hạn độ dài. Vậy bản đồ này thực sự là gì? –

+0

Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ rằng tôi sẽ thêm cho người đọc trong tương lai. Một lý do là nếu bạn sử dụng mã đầu tiên để sau đó tạo ra cơ sở dữ liệu, chú thích api/data thông thạo sau đó được sử dụng trong việc xây dựng các câu lệnh tạo bảng, nơi nó cần biết chiều dài mong muốn và cứ thế. – Kate

3

Tôi đã gặp khó khăn với điều này trong một thời gian, và đây không phải là xác thực của khách hàng vì nó yêu cầu một chuyến đi khứ hồi, nhưng nó cho phép bạn hưởng lợi từ phần tóm tắt Xác thực và người trợ giúp thư trong mẫu chuẩn. Trong phương pháp hành động điều khiển của bạn, bạn chỉ đơn giản là quấn SaveChanges() cuộc gọi của bạn trong một thử - bắt và thêm các lỗi dẫn đến ModelState như sau:

try { 

    //This does not pick up fluent validation failures 
    if (ModelState.IsValid) { 
     db.Entity.Add(entity); 
     db.SaveChanges(); 
     //Users want to create loads of my entities without seeing the index... 
     return RedirectToAction("Create"); 
    } 

} catch (DbEntityValidationException e) { 

    //Log errors 
    foreach (var result in e.EntityValidationErrors) { 
     foreach(var error in result.ValidationErrors){ 
      ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
     } 
    } 

} 

//return to view with current model + validation errors 
return View(entity) 

này sẽ đương nhiên đòi hỏi làm việc nhiều hơn một chút nếu bạn đang tiết kiệm nhiều đơn vị ở đây .

Tất nhiên sử dụng một đối tượng Xem các mẫu như Ladislav gợi ý sẽ là cách tiếp cận đúng, tuy nhiên tôi đã sử dụng này để hỗ trợ một giao diện người dùng kiểm tra yêu cầu đối với hạ lưu thử nghiệm tích hợp hệ thống trước thời hạn ...

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