Cách xử lý các khung nhìn phức tạp (bao gồm một số phần) trong ứng dụng web MVC


7

Hãy nói rằng tôi đang viết một ứng dụng web blog bằng cách sử dụng mô hình MVC. Bố cục điển hình cho trang chính của ứng dụng blog là - một số loại chỉ mục bài đăng trong phần chính và bên cạnh đó có một số phần bổ sung, như dòng thời gian, bảng điều hướng thẻ, bảng đăng ký, v.v. Những điều khiển đó cũng xuất hiện trên một xem bài đăng, và có thể xuất hiện trên các quan điểm khác tôi có.

Câu hỏi của tôi là - làm thế nào tôi nên xử lý các bảng đó sang một bên trong quan điểm và bộ điều khiển của tôi. Tôi thấy ba cách tiếp cận ở đây:

  1. Tạo một lớp viewmodel lớn chứa tất cả thông tin cần thiết để hiển thị s view (chỉ mục hoặc bài đăng đơn). Trong trường hợp đó, tôi có thể làm cho các bảng này sang một bên một khung nhìn và gọi chúng từ chế độ xem được hiển thị thông qua một phần của khung nhìn lớn đó. Hạn chế là - Tôi sẽ có mã điền viewmodel trong các phương thức điều khiển khác nhau, nghĩa là mã được sao chép. Mà là khá xấu.

  2. Tạo một lớp kết xuất khung nhìn khác. Giả sử, lớp kết xuất trên cùng nhất ghi lại một phần được kết xuất hoàn toàn của html hoặc các hàm mà khi được gọi sẽ xuất ra một html. Lớp bên dưới "lớp kết hợp" này sẽ chỉ cung cấp một phần cho mỗi bảng tôi muốn, bao gồm nội dung chính. Hạn chế ở đây - sử dụng bộ nhớ. Hầu hết các khung hiện đại kết xuất trực tiếp các html thành luồng đầu ra, nhưng theo cách tiếp cận này, các khung nhìn một phần sẽ được hiển thị thành các đối tượng chuỗi trước - dẫn đến chi phí bộ nhớ.

  3. Sử dụng một cái gì đó như "RenderAction" từ asp.net mvc, gọi phương thức điều khiển từ chế độ xem. Tôi nghĩ rằng đây là một giải pháp tồi tệ nhất trong 3 được đưa ra, bởi vì nó bỏ đi một cách tiếp cận MVC.

Câu hỏi không gắn liền với bất kỳ khuôn khổ cụ thể nào, tôi muốn hiểu cách làm việc chung như thế.

CẬP NHẬT

Sau khi có câu trả lời, tôi phát hiện ra rằng bài đăng không rõ ràng. Vì vậy, cập nhật hợp lý ở đây:

Theo thuật ngữ viewmodel, tôi hiểu một đối tượng chứa tất cả dữ liệu cần thiết để hiển thị một chế độ xem cụ thể.

Tất cả ba cách tiếp cận liên quan đến việc xây dựng các khung nhìn một phần với khung nhìn riêng của chúng. Ví dụ: (sử dụng cú pháp C #):

class SinglePostViewModel {
  string Text {get;set;}
  string Title {get;set;}
  string Slug {get;set;}
  DateTime PublishedDate {get;set;}
  ...
}

class TagNavigationPanelViewModel {
  string TagText {get;set;}
  int PostsCount {get;set;}
}

class CalendarNavigationPanelViewModel {
  DateTime YearAndMonth {get;set;}
  int PostsCount {get;set;} 
}

Câu hỏi của tôi là - làm thế nào để kết hợp độc đáo những quan điểm một phần với nhau.

Câu trả lời:


1

Tôi thấy một phương pháp khác, trừ khi tôi hiểu nhầm bài đăng của bạn, đã không được đề cập:

Quan điểm chính post, sẽ có mô hình của nó. Mô hình này sẽ bao gồm CHỈ các thuộc tính cần thiết để hiển thị bài đăng này ( author, title, body, vv). Sau đó, mỗi mảnh của postquan điểm cho rằng bạn có thể nghĩ đến ( timeline, tag navigation panel, subscribing panel, vv), sẽ được chia thành quan điểm của riêng mình và mỗi người sẽ có mô hình riêng của mình. Bằng cách này, bạn có thể xây dựng các mô hình đó trong bộ điều khiển của mình khi bạn cần chúng.

Nghe có vẻ như một lượng công việc phụ không cần thiết để phân chia những thứ này ra như thế này, nhưng nó tự cho mình theo nguyên tắc trách nhiệm duy nhất . Giữ mỗi "khung nhìn / mô hình" tập trung vào chính nó để có thể sử dụng lại bất cứ nơi nào cần thiết.

Nếu bạn cảm thấy rằng mã của bạn đang bắt đầu tự sao chép, điều này có thể tùy thuộc vào tình huống của bạn, bạn nên xem xét việc viết một số loại "lớp trợ giúp". Lớp trình trợ giúp này sẽ xử lý tất cả các mô hình xây dựng ở một nơi và tất cả các mã trùng lặp khác sẽ được chuyển xuống một lệnh gọi của lớp trợ giúp.


Đây là một cách tiếp cận chung tôi cố gắng làm theo. Câu hỏi của tôi là về cách kết hợp các quan điểm một phần này với các mô hình riêng với nhau. Tuy nhiên, tôi sẽ cập nhật câu hỏi để làm cho nó rõ ràng hơn.
Hedin

1
Tôi thấy ... xin lỗi vì sự nhầm lẫn ban đầu. Tôi muốn đi với chế độ xem container chứa tất cả các chế độ xem một phần cần thiết, cá nhân.
ethorn10

1

Những gì tôi đang làm là một biến thể / kết hợp các điểm 1 và 3. Tôi kết hợp các khung nhìn trong một lớp chứa và sử dụng nó như một khung nhìn "chính". Việc vượt qua các bộ phận như mô hình cho các hạt.

Theo ví dụ của bạn, tôi sẽ tạo viewmodel này cho trang mặc định:

class DefaultViewModel {
  public List<SinglePostViewModel> Posts ...
  public TagNavigationPanelViewModel Tags ...
  public CalendarNavigationPanelViewModel Calendar ...
  ...
}

Trong Default.cshtml

@model DefaultViewModel
...html for rendering the default page...


@Html.Partial("_TagNavigationPanel", Model.Tags)
...etc...

Trong _TagNavlationPanel.cshtml

@model TagNavigationPanelViewModel
...html+razor for rendering the tags...

Sau đó, làm theo cách tiếp cận tương tự cho một trang bài viết:

class SinglePostPageViewModel {
  public SinglePostViewModel Post ...
  // no tags in single view, for example..
  // public TagNavigationPanelViewModel Tags ...
  public CalendarNavigationPanelViewModel Calendar ...
  // But a list of related, perhaps?
  public List<RelatedPosts> RelatedPosts
  ...
}

Và xây dựng quan điểm của bạn (cshtml (s)) cho phù hợp


Đây là những gì 1 cách tiếp cận là về. Thứ 3 chỉ là về cách gọi RenderAction hoặc @ Html.Action, liên quan đến việc gọi phương thức điều khiển. Cảm ơn đã trả lời!
Hedin

1
@Hedin oh, ok ... Tôi nghĩ rằng cách tiếp cận số 1 của bạn là "nguyên khối" hơn, với một chế độ xem lớn (khác nhau). Vì vậy, có, tôi sử dụng 1 và thấy nó tốt. Tôi cũng thích cái thứ ba ít hơn nhưng nó là bộ nhớ đệm tốt. Nếu bạn có vấn đề về hiệu năng hoặc cần lưu trữ các phần của chế độ xem, có thể đáng để thử.
Lorenzo Dematté

Điều gì về việc bỏ qua một phần xem? ví dụ dựa trên vai trò người dùng?
LifeH2O 17/05/2015

0

Bạn có thể tạo một đĩa đơn "container" xem với cả ba subviews - SinglePostView, TagNavigationPanelViewCalendarNavigationPanelView. Bạn cũng có thể thay thế SinglePostViewbằng bất kỳ chế độ xem nào khác mà trang yêu cầu. Bằng cách này, bạn chỉ cần thay thế chế độ xem "trung tâm" (bài đăng) cho các trang khác bằng loại chế độ xem khác (ví dụ: danh sách bài đăng) và các chế độ xem khác chỉ cần được cập nhật với dữ liệu tương ứng, không được thay thế.

Chế độ xem vùng chứa của bạn (ví dụ MyView) sẽ giữ các tham chiếu đến tất cả các cuộc phỏng vấn. Nó có thể có các updatephương pháp khác nhau được sử dụng để cập nhật các khung nhìn khác nhau. Ví dụ - updateCalendar(CalendarNavigationPanelViewModel calendarData)hoặc updatePost(SinglePostViewModel postData). Hoặc thậm chí là một lần duy nhất update(IViewModel modelData)- sau đó bạn sẽ cần kiểm tra loại (và diễn viên) modelDatađể xác định chế độ xem nào sẽ cập nhật

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.