ASP.NET MVC so với Web Forms Smackdown (p.3)
_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 ...
_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/