ASP.NET MVC Model so với ViewModel


92

OK, tôi đã nghe thảo luận về "ViewModels" liên quan đến ASP.NET MVC của MS.

Bây giờ, nó được dự định là một loại Mô hình cụ thể, đúng không? Không phải là một loại Chế độ xem cụ thể.

Theo hiểu biết của tôi, đó là một loại Mô hình có mục đích cụ thể là tương tác với Chế độ xem? Hoặc điều tương tự?

Một số làm rõ sẽ được đánh giá cao.

Câu trả lời:


71

Về cơ bản Model và View Model đều là các lớp đơn giản với các thuộc tính.

Mục tiêu chính của các lớp này là mô tả (thành "Mô hình") một đối tượng cho các đối tượng tương ứng của chúng tương ứng là bộ điều khiển và khung nhìn.

Vì vậy, bạn hoàn toàn đúng khi bạn nói

Theo hiểu biết của tôi, đó là một loại Mô hình có mục đích cụ thể là tương tác với Chế độ xem

Vì vậy, trong khi các lớp Mô hình là các Thực thể miền mà ứng dụng của bạn tương tác một cách hiệu quả, thì Mô hình Chế độ xem là các lớp đơn giản mà các khung nhìn của bạn tương tác với.

Hy vọng nó giúp :)

Cập nhật :

Microsoft đã phát triển một phiên bản chuyên biệt của Presentation Pattern bởi Martin fowler phần lớn dựa trên Model-View-Controller và gọi nó là Model-View-ViewModel (MVVM) cho ứng dụng PF. Mô hình này được nhắm mục tiêu vào các nền tảng phát triển giao diện người dùng hiện đại, nơi các nhà phát triển giao diện người dùng có các yêu cầu khác nhau dựa trên logic kinh doanh nhiều hơn so với các nhà phát triển truyền thống. Hãy xem ở đây để biết một chút lý thuyết


1
OK, cảm ơn và cũng cảm ơn vì bản cập nhật, nó khá hữu ích! Vì vậy, không tính đến phiên bản đặc biệt của MS, với cổ phiếu MVC 2, bạn có đặt ViewModels trong một thư mục đặc biệt, được chỉ định không? Hay về cơ bản chúng chỉ nằm ngay trong thư mục Mô hình giống như bất kỳ thư mục nào khác. Hoặc, bạn có thể làm một trong hai?
Qcom

Không có gì. Thông thường mô hình nơi tôi và xem mô hình trong cùng một thư mục vì tôi muốn nhóm chúng lại với nhau tôn trọng đến tên miền mà họ tham khảo nhưng đó chỉ là sự lựa chọn của tôi và tôi chắc chắn có tốt hơn
Lorenzo

5
ViewModel phải tách View khỏi (miền) Model. Vì vậy, sẽ hợp lý khi đặt ViewModel gần View, không gần Model.
Vitaliy Ulantikov

Tôi sẽ giữ các lớp 'Model' bên ngoài dự án MVC của mình thay vì trong thư mục Model - Tuy nhiên, tôi sẽ giữ các lớp View Model bên trong dự án MVC, như Vitaliy nói chúng sẽ ở gần View.
Dan Harris

@Lorenzo Trên dòng đầu tiên, bạn nói "cả hai lớp đơn giản có thuộc tính." Tôi nghĩ bạn có nghĩa là với tài sản? Nếu không, bạn đang đề cập đến thuộc tính nào? Thuộc tính so với Thuộc tính
xr280xr

69

Nói một cách đơn giản nhất, tôi muốn nghĩ như sau:

Mô hình: Giao diện giống hệt mô hình dữ liệu của bạn. Đối với tất cả các ý định và mục đích, nó chỉ là đại diện lớp cho mô hình dữ liệu của bạn. Nó không biết về Chế độ xem của bạn hoặc bất kỳ yếu tố nào trong Chế độ xem của bạn. Điều đó nói rằng, nó không được chứa bất kỳ trình trang trí thuộc tính nào (tức là; Bắt buộc, Độ dài, v.v.) mà bạn sẽ sử dụng cho Chế độ xem của mình.

Chế độ xem Mô hình: Đóng vai trò là chất kết dính dữ liệu giữa Chế độ xem và Mô hình của bạn và trong nhiều trường hợp, cũng là một trình bao bọc cho Mô hình của bạn. Nó sẽ trở nên vô dụng nếu không có Chế độ xem, do đó, nó thường không thể sử dụng lại trên nhiều Chế độ xem và Bộ điều khiển như Mô hình tiêu chuẩn.

Ví dụ: Mô hình của bạn có thể có các thuộc tính sau, là các thuộc tính đại diện trực tiếp cho nguồn dữ liệu của bạn:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Bây giờ, vì Mô hình Chế độ xem của bạn được liên kết với Chế độ xem của bạn, nó có thể có thuộc tính sau - thuộc tính này nối trường FirstName của Mô hình và trường LastName với nhau thành một chuỗi:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
Bạn có thể cung cấp một ví dụ đầy đủ hơn về ViewModel không? Làm thế nào nó biết myModel là gì và làm thế nào nó lấy dữ liệu cho myModel?
M Kenyon II

5
Về bản chất, ViewModel là một đối tượng C # (POCO) đơn giản và sẽ không bao giờ thực sự biết mô hình dữ liệu của bạn trông như thế nào. Nó giống như sự kết hợp giữa mô hình dữ liệu của bạn và các yếu tố cụ thể mà chế độ xem của bạn cần hiển thị. Về cách nó lấy dữ liệu, bạn phải tải nó cùng với dữ liệu. Tôi muốn sử dụng một lớp trung gian riêng biệt, nơi tôi gọi dịch vụ của mình cho dữ liệu và sau đó tải dữ liệu đó theo cách thủ công vào ViewModel của tôi. Sau đó, tôi trả lại ViewModel đã được tải đầy đủ cho hành động của bộ điều khiển.
Jason Marsell

26

Tôi thấy bài viết này là một tài nguyên rất hữu ích để hiểu cách "Mô hình miền" và "Mô hình chế độ xem" tương tác trong một ứng dụng MVC, đặc biệt là liên quan đến ràng buộc. Tốt nhất là bao gồm các ví dụ thay vì mô tả trừu tượng.

"Kể từ khi MVC được phát hành, tôi đã quan sát thấy nhiều sự nhầm lẫn về cách tốt nhất để xây dựng mô hình lượt xem. Đôi khi sự nhầm lẫn này không phải là không có lý do chính đáng vì dường như không có nhiều thông tin về các khuyến nghị thực tiễn tốt nhất. Ngoài ra, không có giải pháp “một kích thước phù hợp với tất cả” hoạt động như một viên đạn bạc. Trong bài đăng này, tôi sẽ mô tả một số mô hình chính đã xuất hiện và ưu / nhược điểm của từng loại. Điều quan trọng cần lưu ý là nhiều mô hình trong số này đã xuất hiện từ những người giải quyết các vấn đề trong thế giới thực. "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

WikiPedia có mô tả đầy đủ hơn về Model so với ModelView mà bạn sẽ nhận được trong câu trả lời SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Tôi trích dẫn:

Mô hình : như trong mẫu MVC cổ điển, mô hình đề cập đến (a) mô hình đối tượng đại diện cho nội dung trạng thái thực (cách tiếp cận hướng đối tượng) hoặc (b) lớp truy cập dữ liệu đại diện cho nội dung đó (một dữ liệu- cách tiếp cận trọng tâm).

Chế độ xem : như trong mẫu MVC cổ điển, chế độ xem đề cập đến tất cả các phần tử được hiển thị bởi GUI như các nút, cửa sổ, đồ họa và các điều khiển khác.

ViewModel : ViewModel là “Mô hình của Chế độ xem” có nghĩa là nó là một phần trừu tượng của Chế độ xem cũng đóng vai trò liên kết dữ liệu giữa Chế độ xem và Mô hình. Nó có thể được xem như một khía cạnh chuyên biệt của một Bộ điều khiển (trong mẫu MVC) hoạt động như một chất kết dính / chuyển đổi dữ liệu thay đổi thông tin Mô hình thành thông tin Chế độ xem và chuyển các lệnh từ Chế độ xem vào Mô hình. ViewModel hiển thị các thuộc tính, lệnh và phần tóm tắt công khai. ViewModel đã được ví như một trạng thái khái niệm của dữ liệu trái ngược với trạng thái thực của dữ liệu trong Mô hình.


3
Trong khi có mô tả về Model và ViewModel, liên kết đó chỉ là mô tả mẫu kiến ​​trúc MVVM. Không phải là sự khác biệt giữa Model và View Models
Lorenzo

5

Có một khái niệm về ViewModel, nhưng nó thường không được liên kết với Asp.net MVC. MVC sử dụng mẫu Bộ điều khiển Chế độ xem Mô hình, nơi bộ điều khiển xử lý các tương tác, xây dựng dữ liệu từ Mô hình, rồi chuyển dữ liệu đó đến Chế độ xem để hiển thị.

ViewModels (và mẫu ViewModel Model View) thường được liên kết với Silverlight và WPF. Xaml hơi khác ở chỗ các khung nhìn có thể thực hiện liên kết hai chiều với các ViewModels, vì vậy công nghệ có một chút khác biệt. Ví dụ: nếu bạn liên kết hộp văn bản với một trường, khi bạn nhập vào hộp văn bản đó, giá trị của trường sẽ được cập nhật động. Loại tương tác này không thực sự khả thi trong các trang web vì các trang web là không trạng thái.

Điểm giống nhau trong hai mẫu là cả hai đều cố gắng tách logic khỏi màn hình. Cách sử dụng / lý do phổ biến nhất cho điều này là thử nghiệm: bạn muốn có thể thực hiện từ mã (thông qua khung thử nghiệm) tất cả các tương tác mà người dùng sẽ gọi qua Giao diện người dùng.


Trong cuốn sách tôi đang đọc, "Professional ASP MVC 2", ViewModel được giới thiệu trong Chương 1 như một phương tiện lưu giữ các tương tác giữa bản trình bày / mô hình được gõ mạnh và DRY. Các tác giả microsoft bao gồm Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl,

Gần đây, tôi đã thấy nhiều hơn rằng ViewModel đang được sử dụng trong Asp.net MVC. có vẻ như ViewModel có nhiều hoạt động kinh doanh trong chế độ xem hơn là Mô hình miền. Vì vậy, mô hình mà chúng tôi đang sử dụng là để các mô hình miền lắp ráp các phần chính của ViewModel. Hiện tại, chúng tôi sử dụng một mẫu lệnh đã sửa đổi (hoạt động) hoạt động với các mô hình miền để thực hiện nhiệm vụ của chúng. Kết quả được tập hợp vào ViewModel và được gửi đến chế độ xem. Chế độ xem trong trường hợp này chứa tất cả các chú thích và logic đơn giản, tập trung hỗ trợ chế độ xem.
Sinaesthetic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.