2009-08-13 10 views
6

Tôi có một trang web nơi tôi đang sử dụng fluentNhibernate và Asp.net MVC. Tôi có chế độ xem Chỉnh sửa cho phép người dùng chỉnh sửa 8 trong số 10 thuộc tính cho bản ghi (đối tượng) đó. Khi bạn gửi biểu mẫu và Mô hình liên kết, hai trường không thể chỉnh sửa sẽ trở lại trong mô hình dạng xem dưới dạng Chuỗi trống hoặc làm giá trị Ngày giờ mặc định tùy thuộc vào loại thuộc tính. Vì tôi cũng đang sử dụng AutoMapper để ánh xạ mô hình khung nhìn của tôi cho thực thể miền của tôi, tôi không thể tải một bản sao mới của đối tượng của tôi từ cơ sở dữ liệu và đặt thủ công 2 thuộc tính bị thiếu. Whats cách tốt nhất để duy trì những lĩnh vực mà tôi không muốn chỉnh sửa là gì?Làm thế nào để bạn bỏ qua/tồn tại các giá trị trong MVC khi mô hình khung nhìn của bạn không có nhiều trường như mô hình miền của bạn?

Một cách hoạt động là duy trì các giá trị trong trường Nhập ẩn trong Chế độ xem của tôi. Điều đó hoạt động nhưng cảm thấy thô. Tôi đánh giá cao mọi khuyến nghị. Có cách nào trong AutoMapper của tôi để cấu hình chức năng mong muốn này không?

CẬP NHẬT: Ok, Vì vậy, tôi đoán tôi không cố gắng bỏ qua các trường, tôi đang cố gắng đảm bảo rằng tôi không giữ giá trị chuỗi rỗng hoặc trống. Bỏ qua các trường trong AutoMapper chỉ làm như vậy, chúng bị bỏ qua và không có giá trị khi tôi cố gắng ánh xạ chúng trước khi được lưu vào kho lưu trữ của tôi.

+0

Có lý do nào khiến các trường không thể chỉnh sửa thậm chí là một phần của mô hình xem không? – mxmissile

+0

Hiện tại, chúng không phải là một phần của mô hình xem, dường như là một phần của vấn đề. Các trường là 'AddedBy' và 'DateAdded'. Khi đối tượng này được tạo, những đối tượng đó sẽ không bao giờ bị thay đổi. Tôi đã cố gắng kết nối với chế độ xem Chỉnh sửa mà không làm mất dữ liệu đó. Sử dụng dữ liệu của Automapper null khi tôi ánh xạ từ mô hình xem của tôi sang mô hình của tôi – shanabus

Trả lời

2

Default MVM DefaultModelBinder có thể mở rộng và bạn có thể ghi đè lên nó để tạo lược đồ ràng buộc của riêng bạn. Nhưng điều này sẽ liên quan đến công việc nhiều hơn hai "lĩnh vực đầu vào ẩn", trong quan điểm của tôi, không phải là tổng.

+1

Tôi nghĩ rằng các trường nhập ẩn là tổng. Bên cạnh thực tế là bạn đang gửi dữ liệu cho khách hàng chỉ để nó có thể được gửi lại, nó cũng có thể được sửa đổi.Tôi sử dụng các trường không thể chỉnh sửa cho những thứ như quyền sở hữu, ngày tạo, v.v. –

+1

JW, không phải là 2 trường nhập ẩn là tổng - nhưng chế độ xem tiếp theo tôi sẽ làm việc với sẽ chứa hơn 10 trường nhập ẩn. Thats khi tôi bắt đầu đặt câu hỏi về phương pháp này. Đây là một ứng dụng nội bộ nhưng James S cũng có một điểm tốt - những lĩnh vực này có thể bị giả mạo. – shanabus

+0

Trong khi tôi do dự để tin rằng đây là giải pháp tốt nhất, đó là giải pháp mà tôi sẽ sử dụng. – shanabus

2

Bạn có thể nói Automapper bỏ qua 2 thuộc tính:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.SomeValuefff, opt => opt.Ignore()); 

Possible related question.

+0

Tôi đã thử điều này, tôi chỉ nhận giá trị null thay vì chuỗi trống và thuộc tính DateTime quay lại với giá trị mặc định. – shanabus

+1

Vâng, tôi lấy lại điều đó - giải pháp của bạn không hoạt động nếu tôi tải đối tượng từ kho trước khi ánh xạ. Bằng cách này, các trường bị bỏ qua sẽ không ghi đè lên đối tượng được nạp mới - chỉ những trường mà tôi muốn được cập nhật mới được. Cảm ơn – shanabus

+1

Xin lỗi, tôi đã từ chối câu trả lời này vì như tôi đã đề cập trong bình luận đầu tiên của tôi, Ignore() khiến tài sản được 'mới'. Tức là, bỏ qua một thuộc tính DateTime đặt nó thành một cái gì đó như '01/01/0001 'và bỏ qua một thuộc tính chuỗi đặt nó thành "", không phải là null. – shanabus

0

Bạn có thể sử dụng quá tải AutoMapper.Map cũng chấp nhận TEntity không ?!

entity = Mapper.Map(viewmodel, entity); 

Miễn là bạn không có thuộc tính trên chế độ xem, nó sẽ không thay đổi giá trị trên thực thể của bạn. Phải mất thực thể được truyền vào và chỉ áp dụng các thuộc tính từ viewmodel quay trở lại thực thể.