MVC (Model – View – Controller) là là một kiến trúc phần mềm hay mô hình thiết kế được sử dụng trong kỹ thuật phần mềm. Hôm nay mình sẽ giới thiệu cho các bạn về mô hình MVC trong ASP .Net và tạo một project nhỏ để minh họa cho mô hình này.
MVC là chữ viết tắt của Model – View – Controller, đây là một mô hình kiến phần mềm được tạo ra với mục đích quản lý và xây dựng dự án phần mềm có hệ thống hơn. Mô hình này được dùng khá rộng rãi và đặc biệt là trong các ngôn ngữ lập trình web. Trong .NET cũng hỗ các framework để lập trình theo mô hình này.
- Model: có nhiệm vụ thao tác với cơ sở dữ liệu, nghĩa là nó sẽ chứa tất cả các hàm, các phương thức truy vấn trực tiếp với dữ liệu và
controller
sẽ thông qua các hàm, phương thức đó để lấy dữ liệu rồi gửi qua View - View: có nhiệm vụ tiếp nhận dữ liệu từ
controller
và hiển thị nội dung sang các đoạn mã HTML, bạn có thể hiểu nôm na đây người ta còn gọi là thành phần giao diện. - Controller: đóng vài trò trung gian giữa
Model
vàView
. Nó có nhiệm vụ tiếp nhận yêu cầu từ client sau đó xử lý request, loadmodel
tương ứng và gửi data quaview
tương ứng rồi trả kết quả về cho client.
II. TẠO PROJECT ASP .NET MCV 4 RAZOR
Chúng ta sẽ tạo một website đơn giản quản lý sản phẩm, gồm 2 trang, một trang xem tất cả sản phẩm và một trang tạo mới sản phẩm, ở trang xem sản phẩm có nút tạo sản phẩm để chuyển qua trang tạo mới sản phẩm, ngoài ra có thêm mục xóa để xóa sản phẩm.
Cơ sỡ dữ liệu sẽ đơn giản như sau:
Và ta có thể hình dung hoạt động của website như bên dưới
Bước 1: Mở visual studio chọn File -> New -> Project… Sau đó tìm chọn như hình bên dưới.
Bước 2: Ta sẽ dùng Entity Framework Code First để tạo cơ sở dữ liệu, các bạn xem thêm về Entity Framework tại đây
Các bạn lần lượt tạo các class sau trong thư mục Models của project chúng ta vừa tạo (click chuột phải vào thư mục Models chọn Add -> Class…)
Class Category cho bảng Category
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Linq;
- using System.Web;
- namespace MVCExample.Models
- {
- [Table("CATEGORIES")]
- public class Category
- {
- [Key]
- public int IDCategory { set; get; }
- public string Name { set; get; }
- public virtual ICollection
Products { set; get; } - }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Linq;
- using System.Web;
- namespace MVCExample.Models
- {
- [Table("PRODUCTS")]
- public class Product
- {
- [Key]
- public int IDProduct { set; get; }
- public int IDCategory { set; get; }
- public string Name { set; get; }
- public string SeriNumber { set; get; }
- public string Country { set; get; }
- [ForeignKey("IDCategory")]
- public virtual Category Category { set; get; }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Linq;
- using System.Web;
- namespace MVCExample.Models
- {
- public class DataContext:DbContext
- {
- public DbSet
Categories { set; get; } - public DbSet
Products { set; get; } - public DataContext()
- : base("mydata")//Tên của chuỗi kết nối
- {
- //Tạo cơ sỡ dữ liệu nếu chưa có
- Database.SetInitializer
(new DataInitializer()); - }
- public class DataInitializer : CreateDatabaseIfNotExists
- {
- protected override void Seed(DataContext context)
- {
- //Ta thêm một số dữ liệu mẫu cho cơ sở dữ liệu
- context.Categories.Add(new Category { Name = "Xe đạp" });
- context.Categories.Add(new Category { Name = "Xe máy" });
- context.Categories.Add(new Category { Name = "Xe hơi" });
- context.Products.Add(new Product { IDCategory = 1, Name = "Matin",
- SeriNumber = "283y52398hf9u2yr", Country = "Việt Nam" });
- context.Products.Add(new Product { IDCategory = 1, Name = "Kasama",
- SeriNumber = "283yrh45h45j49u2yr", Country = "Việt Nam" });
- context.Products.Add(new Product { IDCategory = 2,
- Name = "Future neo 125", SeriNumber = "283y5sdgwegf9u2yr", Country = "Việt Nam" });
- base.Seed(context);
- }
- }
- }
- }
-
"mydata" connectionString="Data Source=TenServerSQLCuaBan;Initial Catalog=MVCExample;Integrated Security=true;" providerName="System.Data.SqlClient" />
Các bạn click chuột phải vào thư mục View sau đó chọn Add -> New Folder, các bạn đặt tên folder là “ProductsManagements”
Sau đó click chuột phải vào thư mục vừa tạo chọn Add -> New Item… Các bạn tìm chọn MVC 4 View Page (Razor) rồi đặt tên cho trang View của mình và click Add. Chúng ta sẽ tạo 2 trang View có tên lần lượt là AddProduct và ViewProducts
Bước 4: Tạo Controller
Sau khi tạo xong các trang View, ta tạo tiếp controller để điều hướng cho các trang view này, các bạn click chuột phải vào thư mục Controllers và chọn Add -> Controller… các bạn đặt tên cho controller này là “ProductsManagementsController”. Chú ý là tên controller với phần bôi đỏ phải trùng với tên thư mục chứa các trang view mà controller này sẽ điều hướng.
Bước 5: Viết code (mình có giải thích cụ thể trong code nhé)
Khi sử dụng Razor, để chèn mã code C# vào mã HTML, chúng ta sử dụng ký tự @ trước mã C#
Đầu tiên, để hiển thị trang ViewProducts lên Client, chúng ta cần một phương thức làm việc điều hướng tới trang này trong Controller, tại phương thức này ta cũng tiến hành lấy danh sách các Product để trả về cho Client.
Và để tương tác với cơ sở dữ liệu, ta khai báo đối tượng datacontext thuộc Lớp DataContext của phần Model trong class ProductsManagementsController
- DataContext datacontext = new DataContext();
- public ActionResult ViewProducts()
- {//Phương thức này trả về trang ViewProducts cho client
- ViewBag.Products = datacontext.Products.ToList();
- //Chúng ta dùng ViewBag để chứa danh sách Products trong cơ sở dữ liệu
- //phần .Products sau ViewBag là do chúng ta tự đặt
- return View();
- //Trường hợp trang View cúng ta muốn trả về client trùng tên với tên phương thức thì phương thức View chúng ta không đưa tham số vào
- }
- @{
- ViewBag.Title = "ViewProducts";
- }
- @using MVCExample.Models;
ViewProducts
"1">
-
"font-weight:bold"> -
ID -
Category -
Name -
Seri Number -
Country -
Delete
- public ActionResult DeleteProduct(string IDProduct)// tên tham số phải trùng với tên tham số truyền ở client
- {// Phương thức này xóa một product có id là IDProduct, tham số này được truyền đến từ client
- try
- {
- int ID = Convert.ToInt32(IDProduct);
- new Product().DeleteProduct(ID);// gọi phương thức xóa product của lớp Product tren tầng model
- return RedirectToAction("ViewProducts");
- //Cái này có thể hiểu nôn na là nó sẽ gọi phương thức có tên ViewProducts để thực hiện
- }
- catch
- {
- return View("Error");
- }
- }
- //Hàm dùng để xóa 1 product theo id khi controller gọi đến
- public void DeleteProduct (int ID){
- DataContext datacontext = new DataContext();
- Product P = datacontext.Products.SingleOrDefault(x => x.IDProduct == ID);
- //Lấy product có id ddwwocj truyền vào từ cơ sở dữ liệu ra
- if (P != null)
- {//nếu lấy được thì tiến hành xóa
- datacontext.Products.Remove(P);
- datacontext.SaveChanges();
- }
- }
sẽ tìm đến phương thức ViewAddProduct và trả về trang View AddProducts lên trình duyệt, tại phương thức này ta cũng tiến hành lấy danh sách các Category để đưa về client phục vụ cho việc người dùng chọn lựa. Ta thêm phương thức này vào Controller
- public ActionResult ViewAddProduct()
- {//phương thức này trả về trang view AddProduct
- ViewBag.Categories = datacontext.Categories.ToList();
- //Tương tự ta dùng ViewBag để chứa danh sách Category trả về cho Client
- return View("AddProduct");
- //Trường hợp trang View cúng ta muốn trả về client không trùng tên với tên phương thức thì phương thức View chúng ta đa vào tham số là tên trang view chúng ta muốn trả về
- }
- @{
- ViewBag.Title = "AddProduct";
- }
- @using MVCExample.Models;
AddProduct
- @using (Html.BeginForm("AddProduct", "ProductsManagements", FormMethod.Post, new { name = "PM" }))
- {// Đây là câu lệnh tạo form, cái này cũng giống như thẻ
- // và khi submit, nó sẽ gọi đến Controller ProductsManagements để tìm đến hàm AddProduct và tiến hành đưa dữ liệu vào cơ sử dữ liệu
-
-
-
Name: -
"text" name="Name"/>
- public ActionResult AddProduct(FormCollection form)
- {//Phương thức thêm một product và cơ sở dữ liệu
- // đối tượng của LỚp FormCollection sẽ lấy giá trị value của tất cả các control có thuộc tính name
- // trên form gọi đến phương thức này
- Product P = new Product();
- P.IDCategory = Convert.ToInt32(form["Category"]);
- P.Name = form["Name"];// lấy giá trị của thẻ input có tên là Name
- P.SeriNumber = form["Seri"];
- P.Country = form["Country"];
- datacontext.Products.Add(P);
- datacontext.SaveChanges();
- return RedirectToAction("ViewProducts");
- }
- using MVCExample.Models;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MVCExample.Controllers
- {
- public class ProductsManagementsController : Controller
- {
- //
- // GET: /ProductsManagement/
- DataContext datacontext = new DataContext();
- public ActionResult ViewProducts()
- {//Phương thức này trả về trang ViewProducts cho client
- ViewBag.Products = datacontext.Products.ToList();
- //Chúng ta dùng ViewBag để chứa danh sách Products trong cơ sở dữ liệu
- //phần .Products sau ViewBag là do chúng ta tự đặt
- return View();
- //Trường hợp trang View cúng ta muốn trả về client trùng tên với tên phương thức thì phương thức View chúng ta không đưa tham số vào
- }
- public ActionResult ViewAddProduct()
- {//phương thức này trả về trang view AddProduct
- ViewBag.Categories = datacontext.Categories.ToList();
- //Tương tự ta dùng ViewBag để chứa danh sách Category trả về cho Client
- return View("AddProduct");
- //Trường hợp trang View cúng ta muốn trả về client không trùng tên với tên phương thức thì phương thức View chúng ta đa vào tham số là tên trang view chúng ta muốn trả về
- }
- public ActionResult AddProduct(FormCollection form)
- {//Phương thức thêm một product và cơ sở dữ liệu
- // đối tượng của LỚp FormCollection sẽ lấy giá trị value của tất cả các control có thuộc tính name
- // trên form gọi đến phương thức này
- Product P = new Product();
- P.IDCategory = Convert.ToInt32(form["Category"]);
- P.Name = form["Name"];// lấy giá trị của thẻ input có tên là Name
- P.SeriNumber = form["Seri"];
- P.Country = form["Country"];
- datacontext.Products.Add(P);
- datacontext.SaveChanges();
- return RedirectToAction("ViewProducts");
- }
- public ActionResult DeleteProduct(string IDProduct)// tên tham số phải trùng với tên tham số truyền ở client
- {// Phương thức này xóa một product có id là IDProduct, tham số này được truyền đến từ client
- try
- {
- int ID = Convert.ToInt32(IDProduct);
- new Product().DeleteProduct(ID);// gọi phương thức xóa product của lớp Product tren tầng model
- return RedirectToAction("ViewProducts");
- //Cái này có thể hiểu nôn na là nó sẽ gọi phương thức có tên ViewProducts để thực hiện
- }
- catch
- {
- return View("Error");
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Linq;
- using System.Web;
- namespace MVCExample.Models
- {
- [Table("PRODUCTS")]
- public class Product
- {
- [Key]
- public int IDProduct { set; get; }
- public int IDCategory { set; get; }
- public string Name { set; get; }
- public string SeriNumber { set; get; }
- public string Country { set; get; }
- [ForeignKey("IDCategory")]
- public virtual Category Category { set; get; }
- //Hàm dùng để xóa 1 product theo id khi controller gọi đến
- public void DeleteProduct (int ID){
- DataContext datacontext = new DataContext();
- Product P = datacontext.Products.SingleOrDefault(x => x.IDProduct == ID);
- //Lấy product có id ddwwocj truyền vào từ cơ sở dữ liệu ra
- if (P != null)
- {//nếu lấy được thì tiến hành xóa
- datacontext.Products.Remove(P);
- datacontext.SaveChanges();
- }
- }
- }
- }
- routes.MapRoute(
- name: "Default",
- url: "{controller}/{action}/{id}",
- defaults: new { controller = "ProductsManagements", action = "ViewProducts", id = UrlParameter.Optional }
- );
Cảm ơn các bạn đã theo dõi bài viết
0 nhận xét:
Đăng nhận xét