So với Web Forms, MVC đồng thời là một cách tiếp cận cấp thấp hơn để tạo HTML với sự kiểm soát lớn hơn đối với đầu ra của trang và một cách tiếp cận dựa trên kiến trúc, ở cấp độ cao hơn. Hãy để tôi chụp Web Forms và MVC và chỉ ra lý do tại sao tôi nghĩ rằng sự so sánh đó ưu tiên các Biểu mẫu Web trong nhiều tình huống - miễn là bạn không rơi vào một số bẫy Web Forms cổ điển.
Biểu mẫu web
Trong mô hình Web Forms, các trang của bạn tương ứng trực tiếp với yêu cầu trang từ trình duyệt. Do đó, nếu bạn đang hướng người dùng đến danh sách Sách, bạn có thể sẽ có một trang ở đâu đó có tên là "Booklist.aspx" mà bạn sẽ hướng dẫn anh ấy. Trong trang đó, bạn sẽ phải cung cấp mọi thứ cần thiết để hiển thị danh sách đó. Điều này bao gồm mã để lấy dữ liệu, áp dụng bất kỳ logic nghiệp vụ nào và hiển thị kết quả. Nếu có bất kỳ logic kiến trúc hoặc định tuyến nào ảnh hưởng đến trang, bạn cũng sẽ phải viết mã logic kiến trúc trên trang. Phát triển biểu mẫu web tốt thường liên quan đến việc phát triển một tập hợp các lớp hỗ trợ trong một DLL riêng biệt (có thể kiểm tra đơn vị). Các lớp này sẽ xử lý logic nghiệp vụ, truy cập dữ liệu và các quyết định kiến trúc / định tuyến.
MVC
MVC có một cái nhìn "kiến trúc" hơn về phát triển ứng dụng web: cung cấp một giàn giáo được tiêu chuẩn hóa để xây dựng. Nó cũng cung cấp các công cụ để tự động tạo các lớp mô hình, khung nhìn và trình điều khiển trong kiến trúc đã thiết lập. Ví dụ: trong cả Ruby on Rails (chỉ "Rails" từ đây trở đi) và ASP.NET MVC bạn sẽ luôn bắt đầu với cấu trúc thư mục phản ánh mô hình tổng thể của kiến trúc ứng dụng web. Để thêm chế độ xem, mô hình và bộ điều khiển, bạn sẽ sử dụng một lệnh như "Rails script / tạo scaffold {modelname}" (ASP.NET MVC cung cấp các lệnh tương tự trong IDE). Trong lớp trình điều khiển kết quả, sẽ có các phương thức ("Hành động") cho Index (danh sách hiển thị), Hiển thị, Mới và Chỉnh sửa và Hủy bỏ (ít nhất là trong Rails, MVC tương tự). Theo mặc định, những "
Bố cục của các thư mục và tập tin có ý nghĩa trong MVC. Ví dụ: trong ASP.NET MVC, phương thức Index cho đối tượng "Sách" có thể sẽ chỉ có một dòng: "Return View ();" Thông qua sự kỳ diệu của MVC, điều này sẽ gửi mô hình Sách đến trang "/View/Books/Index.aspx" nơi bạn sẽ tìm thấy mã để hiển thị Sách. Cách tiếp cận của Rails tương tự mặc dù logic rõ ràng hơn một chút và ít "ma thuật" hơn. Một Xem trang trong một ứng dụng MVC là thường đơn giản hơn so với một trang Web Forms bởi vì họ không phải lo lắng nhiều về định tuyến, logic kinh doanh hoặc xử lý dữ liệu.
So sánh
Những lợi thế của MVC xoay quanh việc phân tách rõ ràng các mối quan tâm và một mô hình HTML / CSS / AJAX / Javascript tập trung hơn, sạch hơn để tạo đầu ra của bạn. Điều này giúp tăng cường khả năng kiểm tra, cung cấp một thiết kế chuẩn hơn và mở ra cơ hội cho loại trang web "Web 2.0" hơn.
Tuy nhiên, có một số nhược điểm đáng kể là tốt.
Đầu tiên, trong khi thật dễ dàng để có được một trang web demo, mô hình kiến trúc tổng thể có một đường cong học tập đáng kể. Khi họ nói "Quy ước về cấu hình" nghe có vẻ tốt - cho đến khi bạn nhận ra rằng bạn có giá trị của một cuốn sách để học. Hơn nữa, thường là một chút điên rồ để tìm hiểu những gì đang xảy ra bởi vì bạn đang dựa vào ma thuật hơn là các cuộc gọi rõ ràng. Ví dụ: "Chế độ xem trả về ();" gọi ở trên? Cuộc gọi chính xác có thể được tìm thấy trong các Hành động khác nhưng chúng đi đến những nơi khác nhau. Nếu bạn hiểu quy ước MVCsau đó bạn biết tại sao điều này được thực hiện. Tuy nhiên, nó chắc chắn không đủ điều kiện làm ví dụ về cách đặt tên tốt hoặc mã dễ hiểu và các nhà phát triển mới khó nhận hơn so với Web Forms (đây không chỉ là ý kiến: Tôi đã có một thực tập mùa hè tìm hiểu Web Forms vào năm ngoái và MVC năm nay và sự khác biệt về năng suất đã được phát âm - ủng hộ Biểu mẫu web). BTW, Rails tốt hơn một chút về vấn đề này mặc dù Ruby on Rails có các phương thức được đặt tên động mà cũng có một số cách sử dụng nghiêm túc.
Thứ hai, MVC mặc nhiên cho rằng bạn đang xây dựng một trang web kiểu CRUD cổ điển. Các quyết định kiến trúc và đặc biệt là các trình tạo mã đều được xây dựng để hỗ trợ loại ứng dụng web này. Nếu bạn đang xây dựng một ứng dụng CRUD và muốn áp dụng một kiến trúc đã được chứng minh (hoặc đơn giản là không thích thiết kế kiến trúc), thì có lẽ bạn nên xem xét MVC. Tuy nhiên, nếu bạn sẽ làm nhiều hơn CRUD và / hoặc bạn có năng lực hợp lý với kiến trúc thì MVC có thể cảm thấy giống như một chiếc áo khoác cho đến khi bạn thực sự làm chủ mô hình định tuyến cơ bản (phức tạp hơn đáng kể so với định tuyến đơn giản trong ứng dụng WebForms). Ngay cả sau đó, tôi đã cảm thấy như tôi luôn chiến đấu với người mẫu và lo lắng về kết quả không mong muốn.
Thứ ba, nếu bạn không quan tâm đến Linq (vì bạn sợ rằng Linq-to-SQL sẽ biến mất hoặc vì bạn thấy Linq-to-Entity bị sản xuất quá mức và được cung cấp năng lượng) thì bạn cũng không muốn để đi theo con đường này vì các công cụ giàn giáo ASP.NET MVC được xây dựng xung quanh Linq (đây là kẻ giết tôi). Mô hình dữ liệu của Rails cũng khá vụng về so với những gì bạn có thể đạt được nếu bạn có kinh nghiệm về SQL (và đặc biệt là nếu bạn thành thạo TSQL và các thủ tục được lưu trữ!).
Thứ tư, những người đề xuất MVC thường chỉ ra rằng các khung nhìn MVC gần gũi hơn với mô hình HTML / CSS / AJAX của web. Ví dụ: "Trình trợ giúp HTML" - các lệnh gọi mã nhỏ trong trang vew của bạn hoán đổi nội dung và đặt nó vào các điều khiển HTML - dễ dàng tích hợp với Javascript hơn các điều khiển Web Forms. Tuy nhiên, ASP.NET 4.0 giới thiệu khả năng đặt tên cho các điều khiển của bạn và do đó phần lớn loại bỏ lợi thế này.
Thứ năm, những người theo chủ nghĩa thuần túy MVC thường chế nhạo Viewstate. Trong một số trường hợp, họ có quyền làm như vậy. Tuy nhiên, Viewstate cũng có thể là một công cụ tuyệt vời và mang lại lợi ích cho năng suất. Bằng cách so sánh, xử lý ViewState là nhiều dễ dàng hơn cố gắng để tích hợp các điều khiển web của bên thứ ba trong một ứng dụng MVC. Mặc dù tích hợp điều khiển có thể trở nên dễ dàng hơn đối với MVC, nhưng tất cả những nỗ lực hiện tại mà tôi thấy phải chịu là cần phải xây dựng mã (hơi khó hiểu) để liên kết các điều khiển này trở lại lớp Trình điều khiển của khung nhìn (nghĩa là - để hoạt động xung quanh mô hình MVC ).
Kết luận
Tôi thích phát triển MVC theo nhiều cách (mặc dù tôi thích Rails hơn ASP.NET MVC bởi một cú sút xa). Tôi cũng nghĩ rằng điều quan trọng là chúng ta không rơi vào cái bẫy nghĩ rằng ASP.NET MVC là một "mô hình chống" của ASP.NET Web Forms. Họ khác nhau nhưng không hoàn toàn xa lạ và chắc chắn có chỗ cho cả hai.
Tuy nhiên, tôi thích phát triển Biểu mẫu Web vì, đối với hầu hết các tác vụ , đơn giản là hoàn thành công việc dễ dàng hơn (ngoại trừ việc tạo ra một tập hợp các biểu mẫu CRUD). MVC dường như cũng bị ảnh hưởng, ở một mức độ nào đó, từ sự vượt quá lý thuyết. Thật vậy, hãy nhìn vào nhiều câu hỏi được hỏi ở đây trên SO bởi những người biết ASP.NET định hướng trang nhưng những người đang thử MVC. Không có ngoại lệ, có rất nhiều nghiến răng khi các nhà phát triển thấy rằng họ không thể thực hiện các nhiệm vụ cơ bản mà không phải nhảy qua vòng hoặc chịu đựng một đường cong học tập lớn. Đây là điều làm cho Web Forms vượt trội hơn so với MVC trong cuốn sách của tôi: MVC khiến bạn phải trả giá bằng thế giới thực để có thêm một chút khả năng kiểm tra hoặc tệ hơn nữa là đơn giản được xem là tuyệt vời vì bạn đang sử dụngcông nghệ mới nhất.
Cập nhật: Tôi đã bị chỉ trích rất nhiều trong phần bình luận - một số trong đó khá công bằng. Vì vậy, tôi đã dành vài tháng để học Rails và ASP.NET MVC chỉ để đảm bảo rằng tôi đã không thực sự bỏ lỡ điều lớn lao tiếp theo! Tất nhiên, nó cũng giúp đảm bảo rằng tôi cung cấp một câu trả lời cân bằng và phù hợp cho câu hỏi. Bạn nên biết rằng phản hồi trên là một bản viết lại chính của câu trả lời ban đầu của tôi trong trường hợp các bình luận dường như không đồng bộ.
Trong khi tôi đang tìm hiểu kỹ hơn về MVC, tôi nghĩ, trong một thời gian ngắn, tôi sẽ kết thúc với một mea culpa lớn. Cuối cùng tôi đã kết luận rằng, trong khi tôi nghĩ rằng chúng ta cần dành nhiều năng lượng hơn cho kiến trúc và khả năng kiểm tra của Web Forms, thì MVC thực sự không trả lời cuộc gọi cho tôi. Vì vậy, một "lời cảm ơn" nồng nhiệt đến những người cung cấp những lời phê bình thông minh cho câu trả lời ban đầu của tôi.
Đối với những người coi đây là một trận chiến tôn giáo và những người không ngừng chế tạo lũ lụt, tôi không hiểu tại sao bạn lại bận tâm (hơn 20 phiếu bầu trong vài giây nhiều lần chắc chắn là không bình thường). Nếu bạn đang đọc câu trả lời này và tự hỏi liệu có gì đó thực sự "sai" về câu trả lời của tôi cho rằng điểm số thấp hơn nhiều so với một số câu trả lời khác, hãy yên tâm rằng nó nói nhiều hơn về một số người không đồng ý với ý nghĩa chung về cộng đồng (nói chung, cái này đã được nâng cấp hơn 100 lần).
Thực tế là nhiều nhà phát triển không quan tâm đến MVC và thực sự, đây không phải là một quan điểm thiểu số (ngay cả trong MS như các blog dường như chỉ ra).