Helpex - Trao đổi & giúp đỡ Đăng nhập

Các phương pháp hay nhất về ViewModel

Đặng Phương Mai
· 21:48 19/03/2009
4 ngày trước

Từ câu hỏi này , có vẻ hợp lý khi có bộ điều khiển tạo ViewModel phản ánh chính xác hơn mô hình mà chế độ xem đang cố gắng hiển thị, nhưng tôi tò mò về một số quy ước (tôi mới làm quen với mẫu MVC , nếu nó chưa rõ ràng).

Về cơ bản, tôi có những câu hỏi sau:

  1. Tôi thường thích có một lớp / tệp. Điều này có hợp lý với ViewModel không nếu nó chỉ được tạo ra để chuyển dữ liệu từ bộ điều khiển sang chế độ xem?
  2. Nếu một ViewModel thuộc về tệp của chính nó và bạn đang sử dụng cấu trúc thư mục / dự án để giữ mọi thứ riêng biệt, thì tệp ViewModel sẽ thuộc về đâu? Trong thư mục Bộ điều khiển ?

Về cơ bản đó là nó cho bây giờ. Tôi có thể có thêm một vài câu hỏi nữa, nhưng điều này đã làm phiền tôi trong khoảng một giờ qua và dường như tôi có thể tìm thấy hướng dẫn nhất quán ở nơi khác.

CHỈNH SỬA: Nhìn vào ứng dụng NerdDinner mẫu trên CodePlex, có vẻ như các ViewModels là một phần của Bộ điều khiển , nhưng điều đó vẫn khiến tôi không thoải mái khi chúng không có trong tệp của riêng chúng.

238 hữu ích 1 bình luận 83k xem chia sẻ
Bùi Tuyết Oanh
· 05:55 29/03/2009
05:55:07 29/03/2009

Tôi tạo cái mà tôi gọi là "ViewModel" cho mỗi chế độ xem. Tôi đặt chúng trong một thư mục có tên là ViewModels trong dự án Web MVC của tôi. Tôi đặt tên chúng theo bộ điều khiển và hành động (hoặc chế độ xem) mà chúng đại diện. Vì vậy, nếu tôi cần chuyển dữ liệu đến dạng xem SignUp trên bộ điều khiển thành viên, tôi tạo một lớp MemberhipSignUpViewModel.cs và đặt nó trong thư mục ViewModels.

Sau đó, tôi thêm các thuộc tính và phương thức cần thiết để tạo điều kiện chuyển dữ liệu từ bộ điều khiển sang chế độ xem. Tôi sử dụng Automapper để chuyển từ ViewModel của mình sang Mô hình miền và quay lại nếu cần.

Điều này cũng hoạt động tốt cho các ViewModels tổng hợp có chứa các thuộc tính thuộc loại ViewModels khác. Ví dụ: nếu bạn có 5 tiện ích con trên trang chỉ mục trong bộ điều khiển thành viên và bạn đã tạo một ViewModel cho mỗi chế độ xem từng phần - làm cách nào để bạn chuyển dữ liệu từ hành động Index đến các thành phần? Bạn thêm một thuộc tính vào MemberhipIndexViewModel của loại MyPartialViewModel và khi hiển thị một phần, bạn sẽ chuyển vào Model.MyPartialViewModel.

Làm theo cách này cho phép bạn điều chỉnh một phần thuộc tính ViewModel mà không cần phải thay đổi chế độ xem Chỉ mục. Nó vẫn chỉ đi qua trong Model.MyPartialViewModel nên ít có khả năng bạn phải trải qua toàn bộ chuỗi phần tử để sửa một thứ gì đó khi tất cả những gì bạn đang làm là thêm một thuộc tính vào một phần ViewModel.

Tôi cũng sẽ thêm không gian tên "MyProject.Web.ViewModels" vào web.config để cho phép tôi tham chiếu chúng trong bất kỳ chế độ xem nào mà không cần thêm câu lệnh nhập rõ ràng trên mỗi chế độ xem. Chỉ làm cho nó sạch hơn một chút.

211 hữu ích 5 bình luận chia sẻ
Hoàng Trung Anh
· 23:07 06/10/2009
23:07:42 06/10/2009

Tách các lớp theo danh mục (Bộ điều khiển, Mô hình xem, Bộ lọc, v.v.) là vô nghĩa.

Nếu bạn muốn viết mã cho phần Trang chủ của trang web của mình (/), hãy tạo một thư mục có tên Trang chủ và đặt ở đó HomeController, IndexViewModel, AboutViewModel, v.v. và tất cả các lớp liên quan được sử dụng bởi các hành động Trang chủ.

Nếu bạn có các lớp chia sẻ, như ApplicationController, bạn có thể đặt nó ở gốc dự án của mình.

Tại sao phải tách những thứ có liên quan (HomeController, IndexViewModel) và giữ những thứ không có mối quan hệ nào với nhau (HomeController, AccountController)?


Tôi đã viết một bài đăng trên blog về chủ đề này.

127 hữu ích 5 bình luận chia sẻ
Phạm Thanh Vinh
· 21:53 25/03/2009
21:53:06 25/03/2009

Tôi giữ các lớp ứng dụng của mình trong một thư mục con có tên là "Core" (hoặc thư viện lớp riêng biệt) và sử dụng các phương pháp tương tự như ứng dụng mẫu KIGG nhưng với một số thay đổi nhỏ để làm cho các ứng dụng của tôi KHÔ hơn.

Tôi tạo một lớp BaseViewData trong / Core / ViewData / nơi tôi lưu trữ các thuộc tính chung trên toàn trang.

Sau đó, tôi cũng tạo tất cả các lớp ViewData dạng xem của mình trong cùng một thư mục mà sau đó dẫn xuất từ ​​BaseViewData và có các thuộc tính cụ thể của dạng xem.

Sau đó, tôi tạo một ApplicationController mà tất cả các bộ điều khiển của tôi đều lấy từ đó. ApplicationController có một Phương thức GetViewData chung như sau:

protected T GetViewData<T>() where T : BaseViewData, new()
    {
        var viewData = new T
        {
           Property1 = "value1",
           Property2 = this.Method() // in the ApplicationController
        };
        return viewData;
    }

Cuối cùng, trong hành động Bộ điều khiển của tôi, tôi làm như sau để xây dựng Mô hình ViewData của mình

public ActionResult Index(int? id)
    {
        var viewData = this.GetViewData<PageViewData>();
        viewData.Page = this.DataContext.getPage(id); // ApplicationController
        ViewData.Model = viewData;
        return View();
    }

Tôi nghĩ điều này thực sự hoạt động tốt và nó giữ cho chế độ xem của bạn gọn gàng và bộ điều khiển của bạn mỏng.

21 hữu ích 0 bình luận chia sẻ
Vũ Ðan Quế
· 22:34 19/03/2009
22:34:00 19/03/2009

Một lớp ViewModel ở đó để đóng gói nhiều phần dữ liệu được đại diện bởi các phiên bản của lớp thành một đối tượng dễ quản lý mà bạn có thể chuyển đến Chế độ xem của mình.

Sẽ rất hợp lý nếu có các lớp ViewModel của bạn trong các tệp riêng của chúng, trong thư mục riêng. Trong các dự án của mình, tôi có một thư mục con của thư mục Mô hình được gọi là ViewModels. Đó là nơi ViewModels của tôi (ví dụ ProductViewModel.cs) sống.

13 hữu ích 0 bình luận chia sẻ
Dương Vĩnh Thịnh
· 21:47 25/03/2009
21:47:59 25/03/2009

Không có nơi nào tốt để lưu giữ các mô hình của bạn. Bạn có thể giữ chúng trong bộ lắp ráp riêng biệt nếu dự án lớn và có nhiều ViewModels (Đối tượng truyền dữ liệu). Ngoài ra, bạn có thể giữ chúng trong thư mục riêng của dự án trang web. Ví dụ, trong Oxite, chúng được đặt trong dự án Oxite chứa rất nhiều lớp khác nhau. Bộ điều khiển trong Oxite được chuyển sang dự án riêng biệt và các khung nhìn cũng nằm trong dự án riêng biệt.
Trong CodeCampServer ViewModels được đặt tên là * Form và chúng được đặt trong dự án UI trong thư mục Models.
Trong dự án MvcPress, chúng được đặt trong dự án Dữ liệu, cũng chứa tất cả mã để làm việc với cơ sở dữ liệu và hơn thế nữa (nhưng tôi không đề xuất phương pháp này, nó chỉ dành cho một mẫu)
Vì vậy, bạn có thể thấy có rất nhiều quan điểm. Tôi thường giữ các ViewModels (đối tượng DTO) của mình trong dự án trang web. Nhưng khi tôi có hơn 10 mô hình, tôi muốn chuyển chúng sang lắp ráp riêng. Thông thường trong trường hợp này, tôi cũng đang di chuyển các bộ điều khiển để lắp ráp riêng biệt.
Một câu hỏi khác là làm thế nào để dễ dàng ánh xạ tất cả dữ liệu từ mô hình sang ViewModel của bạn. Tôi khuyên bạn nên xem thư viện AutoMapper . Tôi rất thích nó, nó làm tất cả những công việc bẩn thỉu cho tôi.
Và tôi cũng khuyên bạn nên xem xét dự án SharpArchitecture . Nó cung cấp kiến ​​trúc rất tốt cho các dự án và nó chứa rất nhiều khuôn khổ và hướng dẫn tuyệt vời và cộng đồng tuyệt vời.

13 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ asp.net mvc asp.net-mvc-viewmodel , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm