07/10/2018, 18:57
Series ASP.NET MVC - Part 3: Sử dụng ViewModel
Mối quan hệ giữa Controller và View Tại sao đối với các action Create, Edit, Delete đều có 2 action: Ở đây có các khái niệm Request Method: HttpPost, HttpGet: HttpPost: Hiểu đơn giản là đưa dữ liệu được gửi từ Client về Server để xử lý. HttpGet: Truy xuất dữ liệu từ Server trả về ...
Mối quan hệ giữa Controller và View
- Tại sao đối với các action Create, Edit, Delete đều có 2 action:

- Ở đây có các khái niệm Request Method: HttpPost, HttpGet:
- HttpPost: Hiểu đơn giản là đưa dữ liệu được gửi từ Client về Server để xử lý.
- HttpGet: Truy xuất dữ liệu từ Server trả về cho Client để hiển thị.
- Đối với bài này sử dụng 2 method trên HttpGet để sử dụng việc hiển thị ra trang Create Product. Còn HttpPost sẽ sử dụng cho việc bạn submit dữ liệu lên để lưu xuống database.

- Khi bạn Create new tương ứng với việc bạn gọi đến Request Method HttpGet.

- Khi bạn Submit tương ứng với việc bạn gọi đến Request Method HttpPost để lưu lại dữ liệu.
Tạo ViewModel để sử dụng cho hiển thị.
- Tạo thư mục ViewModels:

- Trong thư mục ViewModels tạo class ProductViewModel.cs.

using ProductManagement.Models;
using System.ComponentModel;
namespace ProductManagement.ViewModels
{
public class ProductViewModel
{
public ProductViewModel(int productID, string nameOfProduct, int categoryOfProductID)
{
ProductID = productID;
NameOfProduct = nameOfProduct;
CategoryOfProductID = categoryOfProductID;
GetCategory();
}
[DisplayName("Mã sản phẩm")]
public int ProductID { get; set; }
[DisplayName("Tên sản phẩm")]
public string NameOfProduct { get; set; }
public int CategoryOfProductID { get; set; }
[DisplayName("Tên loại sản phẩm")]
public string CategoryName { get; set; }
public void GetCategory()
{
if (CategoryOfProductID > 0)
{
using (ProductDBContext db = new ProductDBContext())
{
this.CategoryName = db.CategoryOfProducts.Find(this.CategoryOfProductID) != null ?
db.CategoryOfProducts.Find(this.CategoryOfProductID).Description : string.Empty;
}
}
}
}
}
- Trong controller ProductController bạn cần sửa như sau:

public ActionResult Index()
{
var lsProducts = new List<ProductViewModel>();
db.Products.ToList().ForEach(product =>
{
lsProducts.Add(new ProductViewModel(product.ProductID, product.NameOfProduct, product.CategoryOfProductID));
});
return View(lsProducts);
}
- Trong view Index của Product bạn cũng cần sử như sau:

- Kết quả sau khi sử dụng ViewModel

- Tương tự đối với trang Details cũng cần sửa lại như sau:

- Và trong View Details

- Kết quả

Customize lại trang Create, Edit và Delete Product.
- Thông thường ở trường mã loại sản phẩm sẽ được thay bằng dạng Dropdowlist để chọn loại sản phẩm chứ không phải nhập mã loại sản phẩm như thế này.

- Trong thư mục ViewModels tạo view model EditProductViewModel.cs

using ProductManagement.Models;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace ProductManagement.ViewModels
{
public class EditProductViewModel
{
public EditProductViewModel(int productID, string nameOfProduct, int categoryOfProductID)
{
ProductID = productID;
NameOfProduct = nameOfProduct;
CategoryOfProductID = categoryOfProductID;
GetCategories();
}
public int ProductID { get; set; }
[DisplayName("Tên sản phẩm")]
public string NameOfProduct { get; set; }
public int CategoryOfProductID { get; set; }
public IEnumerable<CategoryOfProduct> CategoryOfProducts { get; set; }
public void GetCategories()
{
using (ProductDBContext db = new ProductDBContext())
{
CategoryOfProducts = db.CategoryOfProducts.ToList().AsEnumerable();
}
}
}
}
- Ở đây tại sao trong ViewModel này mình lại tạo thêm 1 dạng IEnumerable<CategoryOfProduct> mục đích để sử dụng cho việc hiển thị ra danh sách các Category của DropdownList.
- Trong Action Create với Request Method Get:

public ActionResult Create()
{
EditProductViewModel editViewModel = new EditProductViewModel();
return View(editViewModel);
}
- Trong Views => Products => Create.cshtml:

- Trong Action Edit với Request Method Get bạn cũng cần sửa lại như sau:

public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
EditProductViewModel editModel = new EditProductViewModel(product.ProductID, product.NameOfProduct, product.CategoryOfProductID);
return View(editModel);
}
- Trong Views => Products => Edit.cshtml:

- Tương tự với Action Delete với Request Method Get

// GET: Products/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
ProductViewModel delModel = new ProductViewModel(product.ProductID, product.NameOfProduct, product.CategoryOfProductID);
return View(delModel);
}
- Trong Views => Products => Delete.cshtml

Kết quả
- Index

- Create

- Details

- Edit

- Delete

Phần kế tiếp
Ờ phần sau mình sẽ hướng dẫn các bạn sử dụng Migration Data để thay đổi cấu trúc dữ liệu.