So sánh mvc và webform

Sự khác nhau giữa Asp.net webform và Asp.net MVC cái nào hay hơn, cái nào phát triển hơn, thường dùng hơn. Bài viết này sẽ giúp bạn có cái nhìn tổng quan hơn về vấn đề này nhé.

Giới thiệu

Dạo qua một số diễn đàn, cộng đồng về tin học, lập trình, chúng ta thường bắt gặp một số câu hỏi kiểu như:

  • - Sự khác nhau giữa ASP.NET MVC và ASP.NET WebForms là gì?
  • - ASP.NET MVC có thể sẽ thay thế ASP.NET WebForms trong thời gian tới không?

Và trong bài viết này, mình sẽ giúp các bạn có cái nhìn đúng hơn về 2 mô hình này.
Đầu tiên, theo như mình tìm hiểu, thì ASP.NET MVC sẽ không thay thế được ASP.NET Webforms. Cả 2 mô hình sẽ cùng phát triển và được sử dụng vào các ứng dụng ASP.NET. Cả 2 đều có ưu và nhược điểm mà chúng ta sẽ cùng thảo luận và so sánh ở dưới đây

So sánh MVC và Webform

So sánh mvc và webform

ASP.NET Webforms ASP.NET MVC
ASP.NET Webforms sử dụng các Page Controller để render ra các layout. Mọi page sẽ được các controller kiểm soát, và file code-behind sẽ thực hiện các request từ người dùng ASP.NET MVC sử dụng Front Controller. Cách tiếp cận này có nghĩa rằng là một controller chung sẽ được sử dụng cho nhiều Page để thực hiện các request
Mỗi trang aspx sẽ được điều khiển bởi chính controller đó trong code behind là là các file aspx.cs/vb, cả 2 liên kết chặt chẽ với nhau View và Controller được tách hẳn nhau
Chính vì thế nên việc tự động kiểm tra thực sự gặp khó khăn hơn Testability là một tính năng quan trọng trong ASP.NET MVC. Việc kiểm tra hướng phát triển diễn ra khá dễ dàng.
Để nắm bắt được trạng thái của một controller nào đó, thì chúng ta phải sử dụng ViewState ASP.NET MVC không có khái niệm ViewState
Chúng ta sẽ gặp nhiều vấn đề trong môi trường web nếu ViewState quá lớn. Vì ViewState lớn thì đồng nghĩa với việc gia tăng kích thước trang, tăng thời gian load và tài nguyên hơn Controller và View không có khái niệm ViewState, cho nên sản phẩm đầu ra trông rất “sạch”
Chỉ yêu cầu kiến thức tối thiểu về HTML, Javascript và CSS Yêu cầu kiến thức sâu về HTML, Javascript và CSS
Có nhiều công cụ hỗ trợ về công nghệ khác ví dụ như RAD… Đối với MVC thì thực sự là một trở ngại
Rất phù hợp cho các ứng dụng quy mô nhỏ và kích thước và số nhóm tham gia hạn chế Phù hợp với các ứng dụng quy mô lớn, có nhiều team cùng tham gia lập trình

Chốt

Thông qua sự so sánh trên, phần nào đã đem đến cho bạn cái nhìn tổng quan về 2 mô hình. Tùy vào một kịch bản phù hợp mà mình cần sử dụng mô hình nào mà thôi.

Bài viết dựa trên ý kiến chủ quan, và còn sơ sài, chúng ta cùng nhau tham khảo để đi đến cái nhìn tổng quan nhất cho những “lứa măng non” tham khảo nhé.

_Bài viết này được viết khi ASP.NET MVC 2 đã ra khỏi dây chuyền lắp ráp. Kể từ đó MVC 3 (4) đã được phát hành. Một cải tiến là "application/json" kiểu MIME được hỗ trợ đầy đủ. Điều này có nghĩa rằng bạn có thể POST và trả về nội dung JSON. _

Làm thế nào để liên kết Fields của Form

Các JSON "Note" field có liên quan đến Form sử dụng JQuery DataLinking . Datalinking là một JQuery Plugin mới cho phép bạn liên kết một đối tượng Javascript đến một trường DOM bằng cách sử dụng .link() và .unlink(). Hãy nhớ rằng DataLinking còn là bản Beta và vẫn có những trục trặc thường xuyên. Ví dụ, khi thực hiện một .ajax() post bạn cần phải chắc chắn rằng bạn .unlink()đối tượng Javascript của bạn hoặc JQuery sẽ ném một lỗi khó chịu.

ASP.NET Web Forms Form POST

Một trang ASP.NET Web Forms có thể được tích hợp vào ứng dụng web ASP.NET MVC của bạn. ASP.NET Routing cho phép bạn Route một URL vào một trang dễ dàng như một Controller. MapPageRoute() cho phép bạn map một yêu cầu URL tới một ASP.NET Web Forms. Route này cấu hình yêu cầu URL cho "Notepad/WebFormsNotepad" để gọi WebFormsNotepad.aspx trang cho một phản hồi.

routes.MapPageRoute( "WebFormsNotesIndex", "Notepad/WebFormsNotepad", "~/WebFormsNotepad.aspx");

Global.asax.cs trong ScottsJewels.Samples.Notepad Các trang có chứa một server-aware Form để lấy "Notes". Các mẫu có chứa một server-aware Button được đặt tên "getNotesByAuthor". Các nút chỉ định một hàm xử lý sự kiện phía máy chủ có tên là "OnSearchAuthor" để xử lý các sự kiện OnClick. Khi nút được nhấp một POST sẽ được submit lên máy chủ Web cho "NotePad/WebFormsNotepad". POST sẽ chứa dữ liệu cho server-aware Form. ASP.NET Routing sẽ hướng các yêu cầu đến WebFormsNotepad.aspx. Các sự kiện onload của trang sau đó sẽ được bắn tiếp theo phương pháp "OnSearchAuthor".

<form runat="server"> <div> <fieldset> <asp:TextBox ID="searchAuthor" runat="server" /> <asp:Button ID="getNotesByAuthor" OnClick="OnSearchAuthor" runat="server" Text="Search Author"/> </fieldset> </div> </form>

WebFormsNotePad.aspx trong ScottsJewels.Samples.Notepad

public partial class WebFormsNotepad : System.Web.UI.Page { protected List<Note> Model; protected void OnSearchAuthor(object sender, EventArgs e) { if (searchAuthor.Text != null && !string.IsNullOrEmpty(searchAuthor.Text.Trim())) { Model = NotepadDataAccess.GetInstance().GetNotesByAuthor(searchAuthor.Text); } else { Model = NotepadDataAccess.GetInstance().GetNotes(); } } ...

WebFormsNotePad.aspx.cs trong ScottsJewels.Samples.Notepad Đây là những gì còn lại của Markup của trang. Như bạn có thể nhìn thấy nó trông rất giống với ASP.NET MVC View đối ứng. Điều này đã được thực hiện vào một phần để đơn giản hóa so với ASP.NET MVC. Hãy nhớ rằng một trang ASP.NET Web Forms rất khác so với một ASP.NET MVC View. Mặc dù không thể hiện trong "Notepad" một trang có thể được liên kết với nhiều nguồn dữ liệu của các loại khác nhau. Một trang cũng có điều khiển máy chủ cao hơn hẳn. Các máy chủ Đưa ra một khái niệm coding có thể lưu được trạng thái là ViewState .

<%@ Page Title="My Notepad (Web Forms)" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="WebFormsNotepad.aspx.cs" Inherits="ScottsJewels.Samples.Notepad.WebFormsNotepad" %> <%@ Import Namespace="ScottsJewels" %> <%@ Import Namespace="ScottsJewels.Samples.Notepad.DataModels" %> ... <asp:Content ContentPlaceHolderID="bodyContent" runat="server"> ... <div id="notes"> <% if (Model != null && Model.Count > 0) { foreach (Note note in Model) { %> <div class="note"> <span><%=note.Title%> by <%=note.Author%></span> <p> <%=note.Text%> </p> </div> <% } } %> </div> </asp:Content>

WebFormsNotePad.aspx.cs trong ScottsJewels.Samples.Notepad

ASP.NET Web Forms Form POST sử dụng AJAX

Trong một ASP.NET Web Forms Application có hai cách để xử lý một AJAX Form POST trên máy chủ Web. Bạn có thể dùng một Web Service. Hoặc, bạn có thể dùng một Web Method trên trang riêng của mình. Nếu bạn lưu trữ một Form Web Page trong một ứng dụng ASP.NET MVC bạn có khả năng để xử lý AJAX Form POST sử dụng một bộ điều khiển MVC. Điều này cho phép tận dụng các cơ sở mã từ trước ASP.NET MVC Form POST sử dụng AJAX. Nếu bạn nghĩ về cách làm việc này nó khá đơn giản. Các AJAX Form POST yêu cầu cho một tài nguyên. Các tài nguyên được ánh xạ tới một điều khiển bằng ASP.NET Routing. Form không quan tâm những gì của quá trình nó yêu cầu - chỉ JSON được trả về. Bộ điều khiển không quan tâm đến yêu cầu đến từ đâu - chỉ cần làm thế nào để xử lý nó. Bằng cách tận dụng các điều khiển và client-side Javascript của ASP.NET MVC Form POST sử dụng AJAX có rất ít việc cần làm . Đây là những gì các "addNoteForm" Form trông giống như trên Web Forms Notepad. Nó sẽ POST để các URL tương tự như "addNoteForm" Form MVC Notepad. ASP.NET Routing sẽ định tuyến các yêu cầu để điều khiển tương tự và được sử dụng bởi các ActionMethod MVC Notepad. Các ActionMethod sẽ trả về một JsonResult.

<form action="<%= ResolveUrl("~/Notepad/AddNote") %>" id="addNoteForm"> <div> <fieldset> <legend>Add Note</legend> <p> <label for="author">Author :</label> <input style="position:absolute; left: 120px;" type="text" id="Author" name="Author"/> </p> <p> <label for="title">Title :</label> <input style="position:absolute; left: 120px;" type="text" id="Title" name="Title"/> </p> <p> <label for="text">Text :</label> <input style="position:absolute; left: 120px;" type="text" id="Text" name="Text"/> </p> <p> <button type="submit" name="button" value="GetNotes">Add Note</button> </p> </fieldset> <div id="message"></div> </div> </form>

WebFormsNotePad.aspx trong ScottsJewels.Samples.Notepad

Content Type hạn chế của một WCF Service

Trong tất cả các lý do thật sự của tôi cho việc sử dụng một bộ điều khiển MVC qua một web Service hoặc Web Method ẩn đi một số vấn đề cơ bản. Tôi đã không thể có được một phương pháp một trang Web làm việc trong khuôn khổ ASP.NET Routing và tiếp tục nhận được một tài nguyên Không tìm thấy (404). Tôi đã có một chút may mắn hơn khi sử dụng một WCF Web Service ngoại trừ việc nó không thể phân tích các dữ liệu mẫu trong yêu cầu. Trước đây tôi đã nói như thế nào một ASP.NET MVC Controller là không thể để phân tích nội dung JSON nhưng có thể phân tích nội dung Form. Vâng, trớ trêu thay WCF là khả năng của các đối diện chính xác . Thật là đáng tiếc. Thay vì phát minh lại bánh xe và giới thiệu một số Javascript JSON-cụ thể mới, tôi quyết định "đi với nó" và tận dụng những gì đã có sẵn - Controller MVC.

Ưu và nhược điểm

Không so sánh mà không có một danh sách những thuận và khó của mỗi công nghệ, phải không? Thoạt nhìn nó có vẻ là ASP.NET MVC là cao hơn hẳn chỉ đơn giản là vì nó có nhiều thuận và ít Nhược điểm khi so sánh với ASP.NET Web Forms. Đây không phải là trường hợp. Các mục trong danh sách sau đây cần được cân dựa trên ba điều ...

  • Phức tạp ban đầu của các ứng dụng web.
  • Khả năng mở rộng mong muốn của các ứng dụng web.
  • Kỹ năng của bạn. Chỉ sau khi xem xét các yếu tố này, bạn nên làm một framwork để sử dụng.

ASP.NET MVC

Ưu điểm Thiết kế tốt là baked-in. MVC thúc đẩy thiết kế tốt out-of-the-box. Nó buộc bạn vào nhóm chức năng tương tự vào các đơn vị trong khi mỗi thực thể có ít sự trùng lặp càng tốt. Điều này được gọi là tách các mối quan tâm .

Cụ thể, lực lượng ASP.NET MVC bạn để phân cách trình bày của bạn ("View"), business logic (các "Controller"), và dữ liệu ("Model") vào các lớp riêng biệt.

  • Kiểm tra dễ dàng hơn. Dễ dàng hơn để kiểm tra các thành phần khi họ không dựa vào nhau. Dependencies hút.

  • Khả năng mở rộng. Bằng cách mở rộng thiết kế tốt và testability làm cho một ứng dụng mở rộng hơn.

  • Xoá bỏ ViewState, Server Controls, và postbacks. ASP.NET MVC tuân thủ các chất phi trạng thái của HTTP.

Một ViewState giảm tính hữu ích của các Controls Server "rich" được sử dụng trong ASP.NET Web Forms. Như ASP.NET MVC này phụ thuộc rất nhiều vào sự phát triển phía máy khách sử dụng Javascript và JQuery.

ASP.NET Web Forms cho phép bạn treo lên các sự kiện cho sự kiện điều khiển sẽ kích hoạt một postback đến server. Trong ASP.NET MVC không có những điều như một postback hướng sự kiện. Tất cả bài viết trong ASP.NET MVC phải xảy ra từ bên trong một Form HTML và sử dụng các tiêu chuẩn HTTP GET và POST.

  • Hỗ trợ nhiều hình thức HTML. Một ASP.NET MVC Controller có thể hỗ trợ POST từ nhiều hình thức HTML. Một Form ASP.NET Web Page chỉ có thể hỗ trợ POST từ một (server-aware) Form HTML duy nhất.

Nhược điểm

  • Phức tạp không cần thiết. Không phải tất cả các ứng dụng web cần phải được mở rộng. Đôi khi bạn chỉ cần một ứng dụng rất đơn giản.

  • Đường cong dốc học tập. Cần phải phát triển phía máy khách sử dụng Javascript và JQuery để duy trì kinh nghiệm phía khách hàng.

  • Hỗ trợ mờ nhạt cho JSON. ASP.NET MVC không thích JSON quá nhiều. Một điều khiển MVC có thể trả về JSON nhưng không thể nhận được nó. Điều này đặt ASP.NET MVC vào thế bất lợi khi sử dụng AJAX như tất cả các yêu cầu có chứa nội dung JSON phải được chuyển đổi.

  • Xoá bỏ ViewState, Server Controls, và postbacks. Tại sao là điều này? Bởi cho phép bạn để phát triển nhanh hơn.

ASP.NET Web Forms

Ưu điểm

  • Dễ dàng hơn để chuyển từ Windows Forms. Phát triển Windows là stateful và hướng sự kiện. HTTP là stateless và dựa trên hình thức. ViewState mẫu Web của làm cho phát triển web stateful. Hơn nữa, Form Web Server Controls mô phỏng phát triển theo sự kiện qua PostBacks.

  • Large Hỗ trợ bên thứ 3. Điều khiển kéo-và-thả phong phú được cung cấp từ nhiều công ty như Telerik, Infragistics, vv ...

Nhược điểm

  • Không trừu tượng giữa một yêu cầu HTTP và một trang. Theo mặc định một yêu cầu HTTP map trực tiếp đến một trang. URL Rewritting và Routing (trong đó cung cấp như một sự trừu tượng) không được baked-in. Microsoft đã thực hiện cơ chế định tuyến của MVC có sẵn cho Web Forms trong ASP.NET 4.0.

  • Larger page footprint. ViewState có thể là một con heo. Bảo tồn trạng thái trên một trang làm tăng kích thước trang. ASP.NET 4.0 đã tiếp xúc với những cách thức mới để kiểm soát các ViewState. Ví dụ, các tài sản Control.ViewStateMode bây giờ cho phép bạn vô hiệu hóa ViewState cho toàn bộ một trang và sau đó cho phép nó chỉ là điều khiển mà yêu cầu nó.

  • Tùy thuộc vào thiết kế đơn giản. Trừ khi ứng dụng ASP.NET Web Forms của bạn được thiết kế đúng cách tự nó lên một kiến ​​trúc tighly cùng nơi truy cập dữ liệu, trình bày và bussinuess logic được sáp nhập vào tất cả các mã của một trang phía sau.

  • Khó khăn để thử nghiệm. Kiểm tra đòi hỏi spooling lên toàn bộ ASP.NET runtime để hỗ trợ việc vẽ ViewState, PostBacks, và Server Control.

  • Khó khăn client-side Javascript và CSS. Thẻ điều khiển máy chủ không phải luôn luôn trả lại một cách thích hợp. ASP.NET 4.0 đã tiếp xúc với những cách thức mới để kiểm soát việc rend thẻ. Ví dụ, các tài sản Control.ClientIDMode cung cấp kiểm soát nhiều hơn cách ID của control được tạo ra.

Phần kết luận

Phew! Vâng, có bạn có nó - một sự so sánh của các framework phát triển web hàng đầu của Microsoft.

Nếu bạn có bất kỳ câu hỏi, ý kiến, hoặc gợi ý xin vui lòng cho tôi biết.

Nguồn: http://scottsjewels.blogspot.com/