2010-08-06 40 views
10

Giả sử bạn muốn phát triển Bộ điều khiển của mình để bạn sử dụng ViewModel để chứa dữ liệu cho Chế độ xem bạn hiển thị, nên tất cả dữ liệu có được chứa trong ViewModel không? Điều kiện nào là ok để bỏ qua ViewModel?Khi nào có quyền sử dụng Chế độ xem thay vì Chế độ xem?

Lý do tôi hỏi là tôi đang ở vị trí mà một số mã đang sử dụng ViewData và một số đang sử dụng ViewModel. Tôi muốn phân phối một bộ hướng dẫn trong nhóm khi có quyền sử dụng Chế độ xem và khi nó chỉ dùng phím tắt. Tôi muốn ý kiến ​​từ các nhà phát triển khác, những người đã xử lý vấn đề này để tôi biết các nguyên tắc của tôi không chỉ là tôi bị thiên vị.

Trả lời

9

Chỉ để nhận xét thêm về Fabian; bạn có thể đảm bảo rõ ràng chế độ xem không bao giờ được sử dụng bằng cách làm theo các bước được nêu trong this article. Thực sự không có lý do nào là không phải để sử dụng các mô hình cho mọi thứ.

Nếu bạn không có lựa chọn nào khác ngoài việc sử dụng ViewData (nói về dự án hiện có); ít nhất sử dụng hằng số chuỗi để giải quyết các tên để tránh sử dụng 'chuỗi ma thuật'. Một cái gì đó dọc theo dòng: ViewData[ViewDataKeys.MyKey] = myvalue; Infact, tôi sử dụng này cho bất cứ thứ gì cần phải có "chuỗi dựa trên" (Khóa Phiên, Khóa Cache, VaryByCustom cache key đầu ra, vv).

+4

+1 - chúng tôi luôn sử dụng các chế độ xem kiểu xếp thẳng ở đây nhưng sử dụng chế độ xem cho các bit nhỏ bổ sung 'cắt'. điều này thường CHỈ xảy ra đối với chúng tôi trong các chế độ xem một phần được sử dụng lại ở nhiều nơi khác nhau. –

+1

@jim: Đồng ý, có các trường hợp (như lượt xem một phần được chia sẻ), nơi điều này là không thể tránh khỏi; tốt nhất bạn nên thực hiện các biện pháp để ngăn chặn chính mình khi sử dụng ViewData :) – DanP

+0

Bạn có ý nghĩa gì về chuỗi hằng số so với chuỗi ma thuật và tại sao sử dụng ViewData trong lượt xem chia sẻ không thể tránh khỏi? – Howiecamp

2

Cá nhân tôi không bao giờ sử dụng ViewData, mọi thứ đều diễn ra qua Mô hình, ngoại trừ khi tôi thử nghiệm nội dung nào đó và tôi nhanh chóng cần có thể xem giá trị trên chế độ xem. Mạnh mẽ!

+0

Tôi đồng ý hoàn toàn. Dây ma thuật thì xấu nhất, và rắc rối tồi tệ nhất. Điều đó nói rằng, tôi cũng sử dụng các ViewData để nhanh chóng kiểm tra các công cụ, nhưng vấn đề là khi kết thúc như là giải pháp lâu dài! – DaveDev

+0

Yep - 100% đồng ý. Tôi muốn nếu điều đó thậm chí có thể bị phản đối. –

+1

@ Pure.Krome: Bạn chắc chắn có thể mô phỏng khấu hao bằng phương pháp được mô tả trong bài đăng của tôi. Việc ghi đè thuộc tính viewdata trong bộ điều khiển cơ sở và thêm thuộc tính [Obsolete()] sẽ cho bạn kết quả tương tự (về cơ bản). – DanP

1

Về mặt ASP.NET MVC 2, mẫu ViewModel là cách tiếp cận ưa thích. Cách tiếp cận này tận dụng tối đa việc kiểm tra kiểu tĩnh thời gian biên dịch. Điều này kết hợp với compiling mvc views sẽ làm cho luồng công việc phát triển của bạn nhanh hơn và hiệu quả hơn vì các lỗi được phát hiện trong thời gian xây dựng/biên dịch thay vì thời gian chạy.

3

Một cách tiếp cận bạn có thể xem xét khi chế độ xem trở nên phức tạp hơn, là đặt trước việc sử dụng Mô hình cho trường nhập và sử dụng ViewData để hỗ trợ bất kỳ nội dung nào khác mà Chế độ xem cần hiển thị.

Có ít nhất một vài lập luận để hỗ trợ này:

  1. Bạn có một bậc thầy trang đòi hỏi một số dữ liệu phải có mặt (ví dụ như thông tin người dùng StackOverflow trong tiêu đề). Áp dụng ActionFilter trên toàn trang web giúp dễ dàng điền thông tin này vào ViewData sau mỗi hành động. Để đưa nó vào mô hình sẽ yêu cầu mọi Mô hình khác trong trang web sau đó kế thừa từ một Mô hình cơ sở (điều này có thể không có vẻ xấu ban đầu, nhưng nó có thể trở nên phức tạp một cách nhanh chóng).

  2. Khi bạn xác thực biểu mẫu đã đăng, nếu có lỗi xác thực, có thể bạn sẽ muốn rebind mô hình (với trường không hợp lệ) trở lại chế độ xem và hiển thị thông báo xác thực. Điều này là tốt, vì dữ liệu trong các lĩnh vực đầu vào được đăng trở lại và sẽ được ràng buộc với mô hình, nhưng còn bất kỳ dữ liệu nào khác mà chế độ xem của bạn yêu cầu phải được phổ biến lại? (ví dụ: giá trị danh sách thả xuống, thông báo thông tin, v.v.) Những thông tin này sẽ không được đăng trở lại và có thể trở nên lộn xộn sẽ tái nhập các mô hình này vào mô hình "xung quanh" các giá trị đầu vào đã đăng. Nó thường đơn giản hơn để có một phương thức để điền vào ViewData với dữ liệu ..view.

Theo kinh nghiệm của tôi, tôi thấy phương pháp này hoạt động tốt.

Và, trong MVC3, dynamic ViewModels có nghĩa là không cần lập chỉ mục chuỗi nữa!

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