Cóthể test unit trong ứng dụng mà không cần chạy Controller cùng với tiến trìnhAsp.net và có thể dùng bất kì một unit test framework nào như NUnit,MBUnit,MSTest.... Ti
Trang 1Báo cáo thực tập mô hình
MVC trong Asp.net
Trang 2Lời Cảm Ơn!
Như vậy là bốn năm học tại trường đã gần kết thúc.Đến lúc này em nghĩ mình thậtmay mắn khi được học tại trường Đại Học Khoa Học Huế,đây là một môi trường tốt đểhọc tập và rèn luyện,cở sở vật chất đầy đủ,đặc biệt thầy cô trong trường,khoa đều rấtnhiệt tình
Đặc biệt em xin chần thành cảm ơn các thầy cô trong Khoa Công Nghệ ThôngTin,trong suốt những năm học tại trường thầy cô đã tận tình chăm lo,dẫn dắt chúng emtrong học tập cũng như trong cuộc sống
Báo cáo thực tập là kết quả của quá trình học tập bốn năm tại trường,là kết quả củamột tháng làm việc hăng say,em xin cảm ơn sự giúp đỡ nhiệt tình của thầy NguyễnHoàng Hà đã giúp em hoàn thành báo cáo của mình
Một lần nữa em xin chân thành cảm ơn quý thầy cô,bạn bè đã chỉ bảo,giúp đỡ về họctập cũng như trong cuộc sống.Em luôn nhớ những điều đó như một kỷ niệm khó quêntrong đời sinh viên của mình
Đặng Như Hiếu.Huế,tháng 2 năm 2012
Trang 3Mục Lục
Danh Mục Các Từ Tiếng Anh……….2
Danh Mục Các Bảng……… 2
Danh Mục Các Hình………2
Mở Đầu………2
Phần I.Tổng Quan Về Mô Hình MVC Trong Net 1.1.Lịch sử phát triển………2
1.2.Đặc điểm của Asp.net MVC………2
1.3.Kiến trúc của Asp.net MVC ………2
1.4.So sánh Asp.net Webform với Asp.net MVC ………2
Phần II Các Thành Phần Cơ Bản Trong Asp.net MVC 2.1.Các khái niệm ban đầu………2
2.2.Url và Routing……… 2
2.3.Controller và Action Method……… 2
2.4.Views……….2
2.5.Models………2 Phần III.Xây dựng ứng dụng SportStore
Trang 4Danh Mục Các Từ Tiếng Anh
Trang 5Danh Mục Các Bảng
Trang 6Danh Mục Hình Ảnh
Trang 7Mở Đầu
Lý do chọn đề tài:
Hiện nay việc thiết kế trang web Asp.net là rất dễ dàng đối với lập trình viên,chúng tacó thể tìm tài liệu trên mạng,tham khảo các project để nghiên cứu và pháttriển.Microsdoft muốn tạo ra công cụ để người sữ dụng dễ dàng làm việc và xây dựngtrang web nhanh chóng nhất.Asp.net WebForm được thiết kế để thực hiện những điều đó.Asp.net WebForm được thiết kế để người dùng cảm thấy như mình đang thiết kế mộtchương trình WinForm vậy, bằng cách kéo thả các button, textboxt , tự sinh mã Html,đơn giản, dễ hiểu Chính vì thế Asp.net WebForm dù đã ra đời cách đây hơn mười nămnhưng vẫn được sữ dụng cho đến nay
Chính vì vậy Asp.net WebForm đôi khi lại chính là nhược điểm của chính nó, việcdùng các web control sinh các event để thực hiện hành động cho UI khi có sự tương tácvới người dùng hầu hết thực hiện chậm và gây ra các hạn chế và không thoãi mái, việc sữdụng ViewState để quản lý, các trang web đều có lifecycle,postback
Asp.net MVC chính là một sự lựa chọn thay thế cho Asp.net WebForm được xây dựngvới 3 phần chính:Models(liên quan đến dữ liệu), Views(giao diện), Controllers(điềukhiển), việc chia trang web ra nhiều thành phần giúp cho việc xây dựng trang web mộtcách rõ ràng,chặt chẽ Với cấu trúc 3 lớp việc nâng cấp, sữa đổi hoặc thay thế một chứcnăng sẽ dễ dàng hơn
Với những ưu điểm trên Asp.net MVC chắc chắn sẽ là nền tảng để xây dựng và pháttriển web lý tưởng Tuy nhiên vì đây là công nghệ mới, nên tại Việt Nam hầu như chưađược áp dụng và nếu có thì cũng không nhiều, và hầu hết các bạn sinh viên đều chưa biếtđến nó Chính vì thế mà em đã mạnh dạn chọn đề tài nghiên cứu về MVC để làm báo cáothực tập của mình
Mục đích nghiên cứu:
Nghiên cứu MVC với những mục đích:
Học hỏi kiến thức mới
Quá trình tìm hiểu giúp em nâng cao khả năng tự học của mình
Phục vụ việc xây dựng một ứng dụng MVC trong thực tế
Đối tượng và phạm vi nghiên cứu:
Asp.net MVC 2.0
Xây dựng ứng dụng bán hàng trực tuyến
Phương pháp nghiên cứu:
Nghiên cứu lý thuyết thông qua ebook
Thông qua các ví dụ, video trên mạng
Tổng hợp kiến thức để xây dựng ứng dụng thực tế
Ý nghĩa khoa học và thực tiễn:
Hiện nay Asp.net MVC là công nghệ mới tại Việt Nam và các bạn sinh viên vẫnchưa biết đến nhiều, chính vì thế hoàn thành báo các thực tập này sẽ là một tài liệunhỏ giúp các bạn sinh viên ban đầu muốn tìm hiều về công nghệ mới này
Trang 8 Asp.net MVC có nhiều ưu điểm vượt trội, nó sẽ là tương lai thay thế cho Asp.netWebForm, cho nên việc tìm hiểu về nó sẽ có tình tích cực và thực tiển cao, có thểáp dụng cho bây giờ hoặc tương lai.
Phần I
Tổng Quan Về Mô Hình MVC Trong Net
1.1.Lịch Sử Phát Triển:
Vào những năm 70 của thế kỷ 20, tại phòng thí nghiệm Xerox PARC ở Palo Alto Sự
ra đời của giao diện đồ họa (Graphical User Interface) và lập trình hướng đối tượng(Object Orented Programming) cho phép lập trình viên làm việc với giao diện đồ họa cóthuộc tính và phương thức của nó Không dừng lại ở đó các nhà nghiên cứu của XeroxPARC đã cho ra đời kiến trúc gọi là MVC viết tắt của Model-View-Controller
MVC được phát minh tại Xerox PARC bởi TrygveReenskaug MVC lần đầu tiên xuấthiện công khai là trong Smalltalk-80, sau đó sau một thời gian dài không có thông tin gìvề MVC, ngay cả trong tài liệu Smalltalk-80 Các tài liệu đầu tiên quan trọng đều côngbố là “A cool book for using the Model-View-Controller User Interface Paradigm inSmalltalk-80”, bởi Glenn Krasner và Stephen Pope, xuất bản tháng 8 năm 1988
Thời kì Công nghệ Sức mạnh Điểm yếuJurassic Common Gateway
Interface (CGI) Đơn giản, linh họatLựa chọn duy nhất
vào thời điểm này
Chạy ngoài web server,nên cần nhiềutài nguyên (cần các tiến trình riêng lẻ trên HĐH cho mỗi lời yêu cầu)
Cấp thấp
Bronze age Microsoft Internet
Database Connector (IDC)
Chạy trong web server Chỉ là đóng gói cho những câu truy vấn
SQL và template cho các kết quả có định dạng
1996 Active Server Pages
(ASP) Mục đích chung Thông dịch thời gian thực
Xu hướng “spaghetticode”
2002/03 ASP.NET 1.0/1.1 Đã được biên dịch
Giao diện có trạng thái
Cấu trúc lớn
Xu hướng lập trình hướng đối tượng
Nặng nề trên băng thông
HTML khó nhìnKhông thể test
Trang 91.2.Đặc Điểm Của Asp.net MVC:
Tách rõ ràng các mối liên quan, mở khả năng test TDD(test driven developer) Cóthể test unit trong ứng dụng mà không cần chạy Controller cùng với tiến trìnhAsp.net và có thể dùng bất kì một unit test framework nào như NUnit,MBUnit,MSTest
Có khả năng mở rộng, mọi thứ trong MVC được thiết kế cho phép dễ dàng thayđổi và tùy biến.(ví dụ:có thể lựa chọn sử dụng engine view riêng, routingpolicy,parameter serialization…)
Url mạnh mẽ, trong sáng, đuôi các url không có phần mở rộng aspx.Ví dụ:có thểánh xạ địa chỉ /Product/Edit/4 để thực hiện hành động “Edit” của lớp điều khiểnProductController
Asp.net MVC cũng hổ trợ các file dạng Asp.net như aspx, ascx, Master và đánhdấu các tập tin này như một “view template” (có thể dễ dàng dùng các tính năngcủa Asp.net như lồng Master Page, <%=<% snippets, mô tả server controls,template, data-binding, localization,…)
Tuy nhiên sẽ không còn postback và interactive back server và thay vào đó làinteractive end-user tới một Controller class,sẽ không có viewstate, page lifecycle
Asp.net MVC hổ trợ đầy đủ các tính năng bảo mật của Asp.net như form/windowsauthenticate, Url authorization, membership/roles,output và data caching, session/profile state, configuration system, provider architecture …
1.3.Kiến Trúc Của Asp.net MVC:
Trong mô hình MVC một đối tượng đồ họa người dùng(GUI Component) gồm 3 phần
cơ bản:Models,Views,Controllers
Trang 10 Models: trong các ứng dụng dựa trên MVC đó là những thành phần có nhiệm vụlưu trữ thông tin, trạng thái của các đối tượng, thông thường nó là một lớp đượcánh xạ từ một bảng trong CSDL Lấy ví dụ, chúng ta có lớp Product được sử dụngđể mô tả dữ liệu từ bảng Products trong SQL, bao gồm ProductID, OrderDate
Views:là thành phần chịu trách nhiệm hiển thị lên các thông tin cho người dùngthông qua giao diện Thông thường, các thông tin hiển thị được lấy từ thành phầnModels Ví dụ, đối tượng Product có một "Edit" view bao gồm các textboxes, cácdropdowns và checkboxes để chỉnh sửa các thuộc tính của sản phẩm; có một
"Display" view gồm 2 dòng, cột dòng là ProductID, dòng sau là OrderDate đểxem thông tin về sản phẩm
Controller:chịu trách nhiệm xữ lý các tác động về mặt giao diện, các thao tác đốivới Models, và cuối cùng là chọn một Views thích hợp để hiển thị, trong kiến trúcMVC View chỉ có trách nhiệm hiển thị giao diện mà thôi, còn điều khiển dòngnhập xuất vẫn là do Controller
Một lợi điểm của MVC là nó bắt buộc phải tạo ra sự rành mạch trong liên kết giữa 3thành phần models,views,controllers trong ứng dụng Duy trì được mối quan hệ rànhmạch khiến việc kiểm tra ứng dụng dễ dàng hơn, đồng thời trách nhiệm của các thànhphần được định nghĩa rõ ràng và đều ăn khớp với nhau
1.4.
So S ánh Asp.net Webform V ới Asp.net MVC :
Asp.net Webfrom sử dụng Viewstate để quản lý các trang web đều cólifecycle,postback, dùng các web controls, các evens để thực hiện các hành độngcho UI khi có sự tương tác với người dùng nên hầu hết Asp.net xử lý chậm
Asp.net MVC Framework chia làm 3 phần: Models, Views, Controllers Mọitương tác với Views sẽ thực hiện hành động trong Controller, không cònpostback,lifecycle và các events
Việc kiểm tra test lỗi,debug với Asp.net đều phải chạy tất cả các tiến trình củaAsp.net và mọi sự thay đổi ID của control nào cũng ảnh hưởng đến ứng dụng.Đốivới Asp.net MVC Framework thì việc có thể sử dụng unit test để thẩm định cácControlers thực hiện như thế nào
Tính năng Asp.net Webform Asp.net MVC
Kiến trúc
Webform-Business-Database Models-Views-ControllersCú pháp chương trình Tất cả các sự kiện và
control do server quản lý
Các sự kiện do Controlersquản lý
Truy cập dữ liệu Sữ dụng hầu hết các công
nghệ truy cập dữ liệu trongứng dụng
Sử dụng LinQ to Sql classđể tạo mô hình truy cập đốitượng
Debug Debug chương trình phải
thực hiện tất cả bao gồm cáclớp truy cập dữ liệu,hiểnthị,điều khiển các control
Sử dụng unit test để kiểmtra các phương thức trongController
Tốc độ phân giải Chậm vì trong trang có
nhiều control và Viewstatelớn
Nhanh và không cần phảiquản lý các Viewstate
Tương tác với Javascript Khó khăn do các control
được quản lý bởi server
Dễ dàng hơn do các đốitượng không do server quảnlý
Url address Cấu trúc url có dạng: Cấu trúc địa chỉ rành mạch
Trang 11<filename>.aspx?&<thamsố> theoController/Action/Id dạng
Phần II
Các Thành Phần Cơ Bản Trong Asp.net MVC
2.1.Các Khái Niệm Ban Đầu:
Trong một ứng dụng xây dựng trên mô hình MVC đều được chia làm 3 phần Models,Views, Controllers
Bất cứ một request nào đến sever sẽ được xử lý ở Controller,Controller sẽ tiếp nhậnrequest đó và xữ lý, bên trong Controller sẽ có nhiều Actions, mỗi Action tương ứng xữlý một request Ví dụ chúng ta có ProductController bên trong đó ViewAction để tiếpnhận request để xem xét thông tin của 1 product, trongânkhi UpdateAction tiếp nhậnrequest cập nhật sản phẩm khi người dùng kích nút thay đổi thông tin sản phẩm
Tầng Models đại diện cho những entity với bên trong hệ thống của, đối với một số hệthống thì Business Logic có thể nằm trong tầng Models hoặc nằm trong Controller tùytheo thiết kế
Sau khi Controller làm việc với tầng Models để lấy thông tin cần cho người dùng thìController sẽ gửi cho Views một DataModel và Views sẽ render cái DataModel đó rahiển thị cho người dùng
Trang 12Asp.net MVC không phải là một sự thay thế cho Asp.net WebForm mà chỉ là một sựchọn lựa mới cho những người phát triển web, Asp.net MVC cũng có những khái niệmnhưng Asp.net WebForm như Configuration,Security,Roles…
Cấu trúc chính 1 ứng dụng trong dự án Asp.net MVC:
Trang 13 Content:thư mục chứ file css,file ảnh.
Controllers:chứ các Controller của ứng dụng, một Controller bắt buộc theo sau nócó “Controller”
Models:chứa các lớp Business Logic
Views:chứ những trang aspx,tương ứng với một Controller thì sẽ có một Viewstương ứng
2.2.Url Và Routing:
Hầu hết các Web Framework như Asp, Jsp, Php… đều ánh xạ url vào 1 file lưu trênđĩa.MVC Framwork làm việc theo cách khác, thay vì ánh xạ các file trên đĩa nó sẽ đi trựctiếp vào class những lớp này là các Controllers
Trang 14http://mysite.com/photo Controller=”Gallery”, action=”Display”
http://mysite.com/admin/login Controller=”Admin” action=”Login”
Routing system quản lý tất cả những chuyện này và có 2 nhiệm vụ chính :
Cầu nối giữa url trên thanh địa chỉ của trình duyệt với Controller và Actionmethod tương ứng
Tạo ra những url dựa vào Controller và Action Method mà người lập trình đưavào
Hệ Thống Định Tuyến:
Có 5 thuộc tính của một đối tượng Route:
Thuộc tính Ý nghĩa Kiểu Ví dụ
Url Url dùng để nói
với các Parameters
Nghĩa là nếu không cup cấp một giá trị nào trên url thì sẽ
không có giá trị
nào cho các Parameters
RouterVaulueDictionary new
RouterVaulueDictionary(new{
controller= "Products", action = "List",
category = "Fish", pageIndex = 3 })
Constraints Thiết đặt điều kiện
cho các Parameters
RouterVaulueDictionary new
RouteValueDictionary(new {
pageIndex = @"\d{0,6}"})
DataTokens Thiết đặ tùy chọn
cho các route nhậpvào và sẽ được bộ
định tuyến xữ lý
RouterVaulueDictionary
Thành phần chính:RouteBase, Route và RouteCollection:
Hệ thống định tuyến sẽ chạy khi có request
Cấu hình định tuyến được xây dựng dựa trên 3 thành phần chính:
RouteBase:Là lớp cở sở trừu trường của một route,nếu không thích cách mà nhữngđối tượng route tìm ra những url khớp với nó hoặc muốn làm cho những url códạng khác bạn có thể viết lại lớp và kế thừa từ RouteBase lúc đó ta phải overide lại
2 phương thức:GetRouteData và GetVirtualPath
Route:Là lớp con sử dụng tiêu chuẩn của RouteBase,định nghĩa một URLtemplating, defaults, constraints
Trang 15 RouteCollection:là một định tuyến cấu hình đầy đủ, bao gồm danh sáchRouteBase.
RouteTable.Route là một thể hiện tĩnh của RouteCollection, thông thường nó chỉđược gọi một lần khi ứng dụng chạy lần đầu tiên, trong phương thứcApplication_Start() trong file Globla.asax.cs Nó là một đối tượng tĩnh, vì vậy nó tồntại trong suốt quá trình sống của ứng dụng, và không tại tạo lại mỗi khi có một requesttới Trong hàm Application_Start() lại gọi phương thức tĩnh RegisterRoute()
Quá Trình Xữ Lý Của Routing Khi Có Một Request:
Khi có một request đến, hệ thống sẽ gọi mỗi IHttpModules để đăng kí với ứng dụng,với Net 3.5 ứng dụng sẽ tham chiếu từ Web.config Với Net 4.0 ứng dụng sẽ tham chiếutừ ASP.NET Web.config mở rộng và IIS 7.x applicationHost.config
Module này thực hiện 3 điều:
1 Nó tìm đối tượng RouteBase đầu tiên trong RouteTable.Routes trùng hợprequest.Route phù hợp khi đáp ứng được 3 yếu tố sau:
+ Url request phù hợp theo mẫu của một Route
+ Tất cả các thông số có mặt trong Url request hoặc trong giá trị mặc định.+ Tất cả các thông số đều thõa mãn Constraints
UrlRoutingModule sẽ bắt đầu tìm từ giá trị đầu tiên theo thứ tự các giá trị tiếp theotrong RouteTable.Route cho đến khi gặp giá trị trùng khớp,vì vậy điều quan trọng nhất là
ta phải sắp xếp các route theo đúng thứ tự thích hợp
2 Nó sẽ hỏi đối tượng RouteBase để cung cấp một cấu trúc RouteData, và đặc tảcách xữ lý request như thế nào RouteData là một dữ liệu đơn giản, cấu trúcgồm 4 thuộc tính:
+ Route : Tham chiếu đến tuyến đường được chọn, nó thuộc RouteBase.+ RouteHandler: là đối tượng hiện thực của IrouteHandler, cái mà sẽ xữ lýrequest.Trong Asp.Net MVC nó thường là một thể hiện củaMvcRouteHandler
+ Values: Từ điển chứa tên và giá trị được lấy từ request cộng thêm giá trịmặc định của tham số trong url
+ DataTokens: là từ điển chứa cấu hình bổ sung được cung cấp bởi route đưavào
3 Nó gọi RouteHandler của RouteData, nó cung cấp cho RouteHandler thông tinvề yêu cầu hiện tại thông qua một tham số gọi là requestContext.Điều này baogồm thông tin của RouteData và một đối tượng HttpContextBase đặc tả tất cảthông tin liên quan bao gồm Http header, cookies, authentication, querystring,dữ liệu của form post
RouteValueDictionary:
Thuộc tính mặc định của Route là một RouteValueDictionary, đó là một API linh hoạtvì vậy bạn có thể làm nhiều cách khác nhau mà bạn muốn RouteValueDictionary sẽ tựtrích ra danh sách những thuộc tính (controller,action) vì vậy bạn cần cung cấp danh sáchtên và giá trị những thuộc tính này
Có một cách phổ biến để tạo RouteValueDictionary đó là cung cấp một IDictionary
<string,object> như là một tham số khởi tạo hoặc cách khác là dùng collection initializer.Ví dụ:
Trang 16Tạo Một Tuyến Với MapRoute():
Asp.Net MVC đã mở rộng phương thức cho RouteCollection gọi là MapRoute Nócung câp một cách khác để thêm một tuyến, thay vì gọi route.Add(new Route(…))
Nhận Giá trị Parameter từ Action Methods:
Một action methods có thể lấy ra các parameter Khi Asp.Net MVC muốn gọi mộtaction methods của bạn nó cần cung cấp giá trị cho mỗi parameter trong methods Mộttrong những nới mà nó lấy giá trị là từ RouteData, nó sẽ tìm giá trị trong từ điển củaRouteData, nhằm tìm kiếm một khóa và giá trị tương ứng với tên của parameter
Dùng Default:
Bạn không cung cấp giá trị cho {color}, nó trở thành tham số bắt buộc.nhưng vớirequest /Catalog không phù hợp, lúc này chúng ta có thể tạo ra một tùy chọn bằng cáchthêm vào một đối tượng Default:
Bây giờ nếu có một request dạng: /Catalog/ và Catalog/yellow
Trang 17RouteData.Values[“color”] của /Catalog/ sẽ là giá trị null.
RouteData.Values[“color”] của /Catalog/yellow sẽ là giá trị yellow
Cài Đặt Parameter Không Nhận Giá Trị Default:
Chúng ta có thể dùng giá trị mặc định đặc biệt UrlParameter.Optional thay vì đưa ragiá trị thực cho tham số
Điều này muốn nói rằng nếu request cung cấp một giá trị page thì chúng ta sẽ dùng nó,nhưng nếu request đến không cung cấp giá trị page thì route sẽ không cung cấp giá trịpage cho action methods
Tại sao chúng ta không sử dụng giá trị 0 hoặc null, điều này có 2 lý do:
Nếu action methods của bạn lấy kiểu int cho giá trị page, thì đó không phải làkiểu null, bạn sẽ cung cấp một giá trị là 0 hoặc giá trị nào đó kiểu int, nghĩa làaction methods sẽ luôn nhận một giá trị cho page
Nếu giá trị cho page là null, thì nó sẽ hạn chế đối với parameter của actionmethods khi mà dữ liệu của request đến là nhiều giá trị query string
Dùng Constraints:
Đôi khi chúng ta phải thêm những điều kiện phải đáp ứng cho route
Ví dụ:
Một số route chỉ nối với Get mothod hoặc ngược lại
Một vài parameter sẽ phải tuân theo mẫu
Một số url được yêu cầu bởi những trình duyệt web thông thường, có những urlđược yêu cầu từ trình duyệt thiết bị khác
Trong trường hợp này chúng ta sẽ dùng đến thuộc tính Contraints của Route Đó làcách thiết đặt quy tắt cho các patameter
Kết Hợp Regular Expressions:
Để chắc chắn parameter là một số, chúng ta có thể dùng như sau:
Xác nhận id là số có chiều dài 6 kí tự Ví dụ các url hợp lệ: Articles/1,Articles/123456…
Kết Hợp Với Phương Thức HTTP:
Nếu muốn route chỉ nối với phương thức POST hoặc GET, chúng ta có thể lớpHttpMethodConstraint nó kế thừa từ IRouteConstraint:
Tạo URL đi ra: