SlideShare a Scribd company logo
1 of 16
Download to read offline
Bài số 5 
Chỉnh sửa dữ liệu với MVC 
Table of Contents 
1 Thêm mới dữ liệu trong MVC .......................................................................................... 2 
2 Sửa đổi dữ liệu trong MVC .................................................................................................. 5 
3 Xây dựng quy trìn h test trong ứng dụng ASP.NET MVC ................................................ 9 
3.1 Tạo một controller để test. ........................................................................................... 10 
3.2 Test một view được trả về từ một controller................................................................ 14 
3.3 Test một ViewData được trả về từ một controller ....................................................... 15 
3.4 Test một Result Action được trả về từ một controller ................................................. 16 
4 Tài liệu tham khảo ............................................................................................................... 16
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 2 
1 Thêm mới dữ liệu trong MVC 
Sử dụng ứng dụng BanHang đã có: 
Figure 1. Sửa đổi controller SanPhamController.cs 
Thêm một phương thứ c trong ModelsDataClasses.cs thực hiện ghi nhận thêm mớ i vào cơ sở dữ liệu. 
ModelsDataClasses.cs using System; using System.Collections.Generic; using System.Linq; namespace BanHang.Models { partial class DataClassesDataContext { public List<LoaiSanPham> LayCacLoaiSanPham() { return LoaiSanPhams.ToList(); } public List<SanPham> LaySanPhamTuLoaiSanPham(int id) { return SanPhams.Where(l => l.LoaiSanPham == id).ToList(); }
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 3 
public SanPham LaySanPhamTuID(int id) { return SanPhams.Single(s => s.Id == id); } public void ThemMoiSanPham(SanPham sp) { SanPhams.InsertOnSubmit(sp); } } } 
Thiết lập 2 phương thức thêm mới dữ liệu trong lớp SanPhamController.cs là ThemMoiSanPham và Create. Phương thức ThemMoiSanPham trả về một Views cho phép người sử dụng nhập nội dung sản phẩm, còn phương thức Create sẽ thực thi công việc thêm mới sản phẩm khi người dùng nhấn nú t để submit dữ liệu. 
SanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); }
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 4 
public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } } } 
Tạo Views cho phép thêm mới sản phẩm. 
ViewsSanPhamThemMoiSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="ThemMoiSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.ThemMoiSanPham" %> <asp:Content ID="viewThemMoiSanPham" ContentPlaceHolderID="MainContent" runat="server"> <form action="Create" method="post"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td>Tên sản phẩm:</td> <td><input type="text" id="TenSanPham" name="TenSanPham" /></td> </tr> <tr> <td>Đơn giá:</td> <td><input type="text" id="DonGia" name="DonGia" /></td> </tr> <tr> <td>Số lượng:</td> <td><input type="text" id="SoLuong" name="SoLuong" /></td> </tr> <tr> <td>Loại sản phẩm:</td> <td> <%--<input type="text" id="LoaiSanPham" name="LoaiSanPham" />-- %> <%= Html.DropDownList("loaiSanPham",(SelectList)ViewData["lsp"]) %> </td> </tr>
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 5 
<tr> <td colspan="2">&nbsp;</td> </tr> <tr> <td colspan="2"><input type="submit" value="Thêm mới sản phẩm" /></td> </tr> </table> </form> </asp:Content> 
Thực thi sẽ cho ra kết quả như sau (figure 2) 
Figure 2. Thực hiện thêm mớ i sản phẩm trong MVC 2 Sửa đổ i dữ liệu trong MVC 
Thay đổi danh sách hiển thị sản phẩm cho phép cập nhật dữ liệu 
ViewsSanPhamDanhSachSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="DanhSachSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.DanhSachSanPham" %> <asp:Content ID="viewDanhSachSanPham" ContentPlaceHolderID="MainContent" runat="server"> <h1>Đây là danh sách sản phẩm có trong chuyên mục</h1> <p> <ul> <% foreach (var sp in ViewData.Model) { %> <li> <%= Html.ActionLink(sp.TenSanPham , "ChiTietSanPham/" + sp.Id, "SanPham") %> (<%= Html.ActionLink("Edit" , "CapNhatSanPham/" + sp.Id, "SanPham") %>) </li> <% } %> </ul> </p> <p> <form action="../ThemMoiSanPham" method="post"> <input type="submit" value="Thêm mới một sản phẩm" /> </form> </p>
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 6 
</asp:Content> 
Danh sách sản phẩm bây giờ có thêm một actionlink “Edit” bên cạnh mỗi sản phẩm để ngườ i dù ng tương tác vớ i chứ c năng cập nhật dữ liệu sản phẩm. (figure 3) 
Figure 3. Danh sá ch sản phẩm đã được thay đổi. 
Thêm 2 phương thứ c CapNhatSanPham và Update trong lớ p ControllersSanPhamController.cs 
ControllersSanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); }
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 7 
public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult CapNhatSanPham(int id) { ViewData["Title"] = "Cập nhất sản phẩm"; var spToEdit = (from sp in data.SanPhams where sp.Id = id select sp).First(); ViewData.Model = spToEdit; return View(); } public ActionResult Update() { return RedirectToAction("DanhMucLoaiSanPham"); } } }
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 8 
Trong lớ p ControllersSanPhamController.cs đặt con trỏ chuột bên cạnh phương thứ c CapNhatSanPham, click phải chuột chọn Add View (figure 4) 
Figure 4. Thêm mớ i view cho phương thứ c CapNhatSanPham 
Thiết lập các thuộc tính sau: Đánh dấu chọn vào checkbox “Created a strongly typed view”, chọn thuộc tính của View content là Edit, chọn thuộc tính của View data class là BanHang.Models.SanPham rồi ấn nút Add để thêm vào ViewsSanPhamCapNhatSanPham.aspx (Figure 5) 
Figure 5. Tạo view CapNhatSanPham từ controller CapNhatSanPham 
Sau khi tạo xong ta sẽ có một ViewsSanPhamCapNhatSanPham.aspx như sau:
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 9 
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<BanHang.Models.SanPham>" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> <h2>CapNhatSanPham</h2> <%= Html.ValidationSummary() %> <% using (Html.BeginForm()) {%> <fieldset> <legend>Fields</legend> <p> <label for="Id">Id:</label> <%= Html.TextBox("Id") %> <%= Html.ValidationMessage("Id", "*") %> </p> <p> <label for="TenSanPham">TenSanPham:</label> <%= Html.TextBox("TenSanPham") %> <%= Html.ValidationMessage("TenSanPham", "*") %> </p> <p> <label for="DonGia">DonGia:</label> <%= Html.TextBox("DonGia") %> <%= Html.ValidationMessage("DonGia", "*") %> </p> <p> <label for="SoLuong">SoLuong:</label> <%= Html.TextBox("SoLuong") %> <%= Html.ValidationMessage("SoLuong", "*") %> </p> <p> <label for="LoaiSanPham">LoaiSanPham:</label> <%= Html.TextBox("LoaiSanPham") %> <%= Html.ValidationMessage("LoaiSanPham", "*") %> </p> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> <div> <%=Html.ActionLink("Back to List", "Index") %> </div> </asp:Content> 
3 Xây dựng quy trình test trong ứng dụng ASP.NET MVC 
Có 3 kiểu unit test trong ứng dụng ASP.NET MVC dùng để test các controllers được xây dựng: test view được trả về từ controller action, test dữ liệu trả về từ một controller action, test một controller action được redirect tới một tới một controller action khác. 
Mặc định khi tạo ứng dụng với ASP.NET MVC đã mặc định xây dựng sẵn một project test (Figure 6).
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 10 
Figure 6. Ứng dụng test được tạo 3.1 Tạo một controller để test. 
Xét lớp ControllersSanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() {
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 11 
// Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult CapNhatSanPham(int id) { ViewData["Title"] = "Cập nhất sản phẩm"; var spToEdit = (from sp in data.SanPhams where sp.Id == id select sp).First(); ViewData.Model = spToEdit; return View(); }
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 12 
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Update() { //UpdateModel(sp,FormCollection.KeysCollection); return RedirectToAction("DanhMucLoaiSanPham"); } } } 
Xây dựng một lớp test cho ControllersSanPhamController.cs ở trên, tạo SanPhamControllerTest.cs từ folder Controllers của projects chọn Add  Unit Test (figure 7) 
Figure 7. Xây dựng test cho controller 
Đánh dấu vào phương thức cần được test (figure 8) 
Figure 8. Check chọn phương thức cần test
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 13 
BanHang.TestsControllersSanPhamControllerTest.cs using BanHang.Controllers; using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting.Web; using System.Web.Mvc; namespace BanHang.Tests { /// <summary> ///This is a test class for SanPhamControllerTest and is intended ///to contain all SanPhamControllerTest Unit Tests ///</summary> [TestClass()] public class SanPhamControllerTest { private TestContext testContextInstance; /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #region Additional test attributes // //You can use the following additional attributes as you write your tests: // //Use ClassInitialize to run code before running the first test in the class //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //Use ClassCleanup to run code after all tests in a class have run //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //Use TestInitialize to run code before running each test //[TestInitialize()] //public void MyTestInitialize() //{ //} // //Use TestCleanup to run code after each test has run //[TestCleanup()] //public void MyTestCleanup() //{ //} //
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 14 
#endregion /// <summary> ///A test for ChiTietSanPham ///</summary> [TestMethod()] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void ChiTietSanPhamTest() { SanPhamController target = new SanPhamController(); // TODO: Initialize to an appropriate value int id = 0; // TODO: Initialize to an appropriate value ActionResult expected = null; // TODO: Initialize to an appropriate value ActionResult actual; actual = target.ChiTietSanPham(id); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); } } } 
3.2 Test một view được trả về từ một controller. 
Kiểm tra xem view được trả về có đúng không và khi nào thì nó được gọi đến, phương thức nào của view được trả về. 
BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod()] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void DetailViewTest() { SanPhamController sp = new SanPhamController(); var result = sp.ChiTietSanPham(8) as ViewResult; Assert.AreEqual("ChiTietSanPham", result.ViewName); } 
Bắt đầu thực hiện công việc test (figure 9). Lựa chọn một phương thức test  Run Selection
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 15 
Figure 9. Thực hiện các phương thức test 
Kết quả thực hiện test (figure 10) 
Figure 10. Kết quả thực hiện test DetailViewTest 
3.3 Test một ViewData được trả về từ một controller 
BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void TestViewData()
Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 16 
{ // // TODO: Add test logic here // var controller = new BanHang.Controllers.SanPhamController(); var result = controller.ChiTietSanPham(8) as ViewResult; var sp = (SanPham)result.ViewData.Model; Assert.AreEqual("Yamaha", sp.TenSanPham); } 
3.4 Test một Result Action được trả về từ một controller 
BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void TestResultAction() { // // TODO: Add test logic here // var controller = new BanHang.Controllers.SanPhamController(); var result = (RedirectToRouteResult)controller.ChiTietSanPham(-1); Assert.AreEqual("Index", result.Values["action"]); } 
4 Tài liệu tham khảo 
http://asp.net/mvc 
http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post- scenarios.aspx

More Related Content

Similar to Aspnet 3.5 _05

Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...MasterCode.vn
 
Net06 asp.net applications & state management
Net06 asp.net applications & state managementNet06 asp.net applications & state management
Net06 asp.net applications & state managementhoangnguyentien
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaANHMATTROI
 
Hướng dẫn lập trình với SCSF phần I (smart client software factory)
Hướng dẫn lập trình với SCSF phần I (smart client software factory)Hướng dẫn lập trình với SCSF phần I (smart client software factory)
Hướng dẫn lập trình với SCSF phần I (smart client software factory)Minh Tri Lam
 
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...MasterCode.vn
 
Asp.net mvc 3 (c#) (9 tutorials) egroups vn
Asp.net mvc 3 (c#) (9 tutorials)   egroups vnAsp.net mvc 3 (c#) (9 tutorials)   egroups vn
Asp.net mvc 3 (c#) (9 tutorials) egroups vnNguyen Van Hung
 
E learning lab - Tim hieu Cake PHP
E learning lab - Tim hieu Cake PHPE learning lab - Tim hieu Cake PHP
E learning lab - Tim hieu Cake PHPelearninglabvn
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoMasterCode.vn
 

Similar to Aspnet 3.5 _05 (20)

Aspnet 3.5 _04
Aspnet 3.5 _04Aspnet 3.5 _04
Aspnet 3.5 _04
 
C5. Model, DataSharing.pdf
C5. Model, DataSharing.pdfC5. Model, DataSharing.pdf
C5. Model, DataSharing.pdf
 
Asp.net 3.5 _7
Asp.net 3.5 _7Asp.net 3.5 _7
Asp.net 3.5 _7
 
Ung dung web chuong 6
Ung dung web  chuong 6Ung dung web  chuong 6
Ung dung web chuong 6
 
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
Bài 6: Lập trình với CSDL Kiến trúc kết nối & Buộc dữ liệu - Lập trình winfor...
 
Net06 asp.net applications & state management
Net06 asp.net applications & state managementNet06 asp.net applications & state management
Net06 asp.net applications & state management
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong java
 
Hướng dẫn lập trình với SCSF phần I (smart client software factory)
Hướng dẫn lập trình với SCSF phần I (smart client software factory)Hướng dẫn lập trình với SCSF phần I (smart client software factory)
Hướng dẫn lập trình với SCSF phần I (smart client software factory)
 
Ch06
Ch06Ch06
Ch06
 
C# co ban 10
C# co ban 10C# co ban 10
C# co ban 10
 
Cach su dung data reader
Cach su dung data readerCach su dung data reader
Cach su dung data reader
 
chuong_02.ppt
chuong_02.pptchuong_02.ppt
chuong_02.ppt
 
Bai th 03
Bai th 03Bai th 03
Bai th 03
 
Ung dung web chuong 5
Ung dung web  chuong 5Ung dung web  chuong 5
Ung dung web chuong 5
 
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...
Bài 7: Đối tượng Data Source -Đóng gói ứng dụng - Giới thiệu các kĩ thuật lập...
 
Asp control
Asp controlAsp control
Asp control
 
Ajax Control ToolKit
Ajax Control ToolKitAjax Control ToolKit
Ajax Control ToolKit
 
Asp.net mvc 3 (c#) (9 tutorials) egroups vn
Asp.net mvc 3 (c#) (9 tutorials)   egroups vnAsp.net mvc 3 (c#) (9 tutorials)   egroups vn
Asp.net mvc 3 (c#) (9 tutorials) egroups vn
 
E learning lab - Tim hieu Cake PHP
E learning lab - Tim hieu Cake PHPE learning lab - Tim hieu Cake PHP
E learning lab - Tim hieu Cake PHP
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
 

Aspnet 3.5 _05

  • 1. Bài số 5 Chỉnh sửa dữ liệu với MVC Table of Contents 1 Thêm mới dữ liệu trong MVC .......................................................................................... 2 2 Sửa đổi dữ liệu trong MVC .................................................................................................. 5 3 Xây dựng quy trìn h test trong ứng dụng ASP.NET MVC ................................................ 9 3.1 Tạo một controller để test. ........................................................................................... 10 3.2 Test một view được trả về từ một controller................................................................ 14 3.3 Test một ViewData được trả về từ một controller ....................................................... 15 3.4 Test một Result Action được trả về từ một controller ................................................. 16 4 Tài liệu tham khảo ............................................................................................................... 16
  • 2. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 2 1 Thêm mới dữ liệu trong MVC Sử dụng ứng dụng BanHang đã có: Figure 1. Sửa đổi controller SanPhamController.cs Thêm một phương thứ c trong ModelsDataClasses.cs thực hiện ghi nhận thêm mớ i vào cơ sở dữ liệu. ModelsDataClasses.cs using System; using System.Collections.Generic; using System.Linq; namespace BanHang.Models { partial class DataClassesDataContext { public List<LoaiSanPham> LayCacLoaiSanPham() { return LoaiSanPhams.ToList(); } public List<SanPham> LaySanPhamTuLoaiSanPham(int id) { return SanPhams.Where(l => l.LoaiSanPham == id).ToList(); }
  • 3. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 3 public SanPham LaySanPhamTuID(int id) { return SanPhams.Single(s => s.Id == id); } public void ThemMoiSanPham(SanPham sp) { SanPhams.InsertOnSubmit(sp); } } } Thiết lập 2 phương thức thêm mới dữ liệu trong lớp SanPhamController.cs là ThemMoiSanPham và Create. Phương thức ThemMoiSanPham trả về một Views cho phép người sử dụng nhập nội dung sản phẩm, còn phương thức Create sẽ thực thi công việc thêm mới sản phẩm khi người dùng nhấn nú t để submit dữ liệu. SanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); }
  • 4. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 4 public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } } } Tạo Views cho phép thêm mới sản phẩm. ViewsSanPhamThemMoiSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="ThemMoiSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.ThemMoiSanPham" %> <asp:Content ID="viewThemMoiSanPham" ContentPlaceHolderID="MainContent" runat="server"> <form action="Create" method="post"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td>Tên sản phẩm:</td> <td><input type="text" id="TenSanPham" name="TenSanPham" /></td> </tr> <tr> <td>Đơn giá:</td> <td><input type="text" id="DonGia" name="DonGia" /></td> </tr> <tr> <td>Số lượng:</td> <td><input type="text" id="SoLuong" name="SoLuong" /></td> </tr> <tr> <td>Loại sản phẩm:</td> <td> <%--<input type="text" id="LoaiSanPham" name="LoaiSanPham" />-- %> <%= Html.DropDownList("loaiSanPham",(SelectList)ViewData["lsp"]) %> </td> </tr>
  • 5. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 5 <tr> <td colspan="2">&nbsp;</td> </tr> <tr> <td colspan="2"><input type="submit" value="Thêm mới sản phẩm" /></td> </tr> </table> </form> </asp:Content> Thực thi sẽ cho ra kết quả như sau (figure 2) Figure 2. Thực hiện thêm mớ i sản phẩm trong MVC 2 Sửa đổ i dữ liệu trong MVC Thay đổi danh sách hiển thị sản phẩm cho phép cập nhật dữ liệu ViewsSanPhamDanhSachSanPham.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="DanhSachSanPham.aspx.cs" Inherits="BanHang.Views.SanPham.DanhSachSanPham" %> <asp:Content ID="viewDanhSachSanPham" ContentPlaceHolderID="MainContent" runat="server"> <h1>Đây là danh sách sản phẩm có trong chuyên mục</h1> <p> <ul> <% foreach (var sp in ViewData.Model) { %> <li> <%= Html.ActionLink(sp.TenSanPham , "ChiTietSanPham/" + sp.Id, "SanPham") %> (<%= Html.ActionLink("Edit" , "CapNhatSanPham/" + sp.Id, "SanPham") %>) </li> <% } %> </ul> </p> <p> <form action="../ThemMoiSanPham" method="post"> <input type="submit" value="Thêm mới một sản phẩm" /> </form> </p>
  • 6. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 6 </asp:Content> Danh sách sản phẩm bây giờ có thêm một actionlink “Edit” bên cạnh mỗi sản phẩm để ngườ i dù ng tương tác vớ i chứ c năng cập nhật dữ liệu sản phẩm. (figure 3) Figure 3. Danh sá ch sản phẩm đã được thay đổi. Thêm 2 phương thứ c CapNhatSanPham và Update trong lớ p ControllersSanPhamController.cs ControllersSanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() { // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); }
  • 7. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 7 public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult CapNhatSanPham(int id) { ViewData["Title"] = "Cập nhất sản phẩm"; var spToEdit = (from sp in data.SanPhams where sp.Id = id select sp).First(); ViewData.Model = spToEdit; return View(); } public ActionResult Update() { return RedirectToAction("DanhMucLoaiSanPham"); } } }
  • 8. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 8 Trong lớ p ControllersSanPhamController.cs đặt con trỏ chuột bên cạnh phương thứ c CapNhatSanPham, click phải chuột chọn Add View (figure 4) Figure 4. Thêm mớ i view cho phương thứ c CapNhatSanPham Thiết lập các thuộc tính sau: Đánh dấu chọn vào checkbox “Created a strongly typed view”, chọn thuộc tính của View content là Edit, chọn thuộc tính của View data class là BanHang.Models.SanPham rồi ấn nút Add để thêm vào ViewsSanPhamCapNhatSanPham.aspx (Figure 5) Figure 5. Tạo view CapNhatSanPham từ controller CapNhatSanPham Sau khi tạo xong ta sẽ có một ViewsSanPhamCapNhatSanPham.aspx như sau:
  • 9. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 9 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<BanHang.Models.SanPham>" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> <h2>CapNhatSanPham</h2> <%= Html.ValidationSummary() %> <% using (Html.BeginForm()) {%> <fieldset> <legend>Fields</legend> <p> <label for="Id">Id:</label> <%= Html.TextBox("Id") %> <%= Html.ValidationMessage("Id", "*") %> </p> <p> <label for="TenSanPham">TenSanPham:</label> <%= Html.TextBox("TenSanPham") %> <%= Html.ValidationMessage("TenSanPham", "*") %> </p> <p> <label for="DonGia">DonGia:</label> <%= Html.TextBox("DonGia") %> <%= Html.ValidationMessage("DonGia", "*") %> </p> <p> <label for="SoLuong">SoLuong:</label> <%= Html.TextBox("SoLuong") %> <%= Html.ValidationMessage("SoLuong", "*") %> </p> <p> <label for="LoaiSanPham">LoaiSanPham:</label> <%= Html.TextBox("LoaiSanPham") %> <%= Html.ValidationMessage("LoaiSanPham", "*") %> </p> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> <div> <%=Html.ActionLink("Back to List", "Index") %> </div> </asp:Content> 3 Xây dựng quy trình test trong ứng dụng ASP.NET MVC Có 3 kiểu unit test trong ứng dụng ASP.NET MVC dùng để test các controllers được xây dựng: test view được trả về từ controller action, test dữ liệu trả về từ một controller action, test một controller action được redirect tới một tới một controller action khác. Mặc định khi tạo ứng dụng với ASP.NET MVC đã mặc định xây dựng sẵn một project test (Figure 6).
  • 10. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 10 Figure 6. Ứng dụng test được tạo 3.1 Tạo một controller để test. Xét lớp ControllersSanPhamController.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; using BanHang.Models; namespace BanHang.Controllers { public class SanPhamController : Controller { DataClassesDataContext data = new DataClassesDataContext(); public ActionResult Index() { // Add action logic here ViewData["Title"] = "Sản phẩm"; return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult DanhMucLoaiSanPham() {
  • 11. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 11 // Code cua ban o day ViewData["Title"] = "Danh mục loại sản phẩm"; List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList(); return View("DanhMucLoaiSanPham", lsp); } public ActionResult DanhSachSanPham(int id) { ViewData["Title"] = "Danh sách sản phẩm trong loại sản phẩm"; List<SanPham> sp = data.LaySanPhamTuLoaiSanPham(id); return View("DanhSachSanPham", sp); //DuLieuDanhSachSanPham sp = new DuLieuDanhSachSanPham(); //ViewData.TenLoaiSanPham = loaisanpham; //ViewData.SanPham = data.LaySanPhamTuLoaiSanPham(loaisanpham); //return View("DanhSachSanPham", ViewData); } public ActionResult ChiTietSanPham(int id) { ViewData["Title"] = "Chi tiết sản phẩm"; SanPham ctsp = data.LaySanPhamTuID(id); return View("ChiTietSanPham", ctsp); } public ActionResult ThemMoiSanPham() { ViewData["Title"] = "Thêm mới sản phẩm"; //List<LoaiSanPham> dulieu = data.LayCacLoaiSanPham(); var loaiSanpham = from c in data.LoaiSanPhams select c; ViewData["lsp"] = new SelectList(loaiSanpham, "Id", "TenLoaiSanPham"); return View("ThemMoiSanPham", ViewData["lsp"]); } public ActionResult Create(string TenSanPham, float DonGia, int SoLuong, int loaiSanPham) { SanPham sp = new SanPham(); sp.TenSanPham = TenSanPham; sp.DonGia = DonGia; sp.SoLuong = SoLuong; sp.LoaiSanPham = loaiSanPham; data.ThemMoiSanPham(sp); data.SubmitChanges(); return RedirectToAction("DanhMucLoaiSanPham"); } public ActionResult CapNhatSanPham(int id) { ViewData["Title"] = "Cập nhất sản phẩm"; var spToEdit = (from sp in data.SanPhams where sp.Id == id select sp).First(); ViewData.Model = spToEdit; return View(); }
  • 12. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 12 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Update() { //UpdateModel(sp,FormCollection.KeysCollection); return RedirectToAction("DanhMucLoaiSanPham"); } } } Xây dựng một lớp test cho ControllersSanPhamController.cs ở trên, tạo SanPhamControllerTest.cs từ folder Controllers của projects chọn Add  Unit Test (figure 7) Figure 7. Xây dựng test cho controller Đánh dấu vào phương thức cần được test (figure 8) Figure 8. Check chọn phương thức cần test
  • 13. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 13 BanHang.TestsControllersSanPhamControllerTest.cs using BanHang.Controllers; using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting.Web; using System.Web.Mvc; namespace BanHang.Tests { /// <summary> ///This is a test class for SanPhamControllerTest and is intended ///to contain all SanPhamControllerTest Unit Tests ///</summary> [TestClass()] public class SanPhamControllerTest { private TestContext testContextInstance; /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #region Additional test attributes // //You can use the following additional attributes as you write your tests: // //Use ClassInitialize to run code before running the first test in the class //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ //} // //Use ClassCleanup to run code after all tests in a class have run //[ClassCleanup()] //public static void MyClassCleanup() //{ //} // //Use TestInitialize to run code before running each test //[TestInitialize()] //public void MyTestInitialize() //{ //} // //Use TestCleanup to run code after each test has run //[TestCleanup()] //public void MyTestCleanup() //{ //} //
  • 14. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 14 #endregion /// <summary> ///A test for ChiTietSanPham ///</summary> [TestMethod()] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void ChiTietSanPhamTest() { SanPhamController target = new SanPhamController(); // TODO: Initialize to an appropriate value int id = 0; // TODO: Initialize to an appropriate value ActionResult expected = null; // TODO: Initialize to an appropriate value ActionResult actual; actual = target.ChiTietSanPham(id); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); } } } 3.2 Test một view được trả về từ một controller. Kiểm tra xem view được trả về có đúng không và khi nào thì nó được gọi đến, phương thức nào của view được trả về. BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod()] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void DetailViewTest() { SanPhamController sp = new SanPhamController(); var result = sp.ChiTietSanPham(8) as ViewResult; Assert.AreEqual("ChiTietSanPham", result.ViewName); } Bắt đầu thực hiện công việc test (figure 9). Lựa chọn một phương thức test  Run Selection
  • 15. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 15 Figure 9. Thực hiện các phương thức test Kết quả thực hiện test (figure 10) Figure 10. Kết quả thực hiện test DetailViewTest 3.3 Test một ViewData được trả về từ một controller BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void TestViewData()
  • 16. Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 16 { // // TODO: Add test logic here // var controller = new BanHang.Controllers.SanPhamController(); var result = controller.ChiTietSanPham(8) as ViewResult; var sp = (SanPham)result.ViewData.Model; Assert.AreEqual("Yamaha", sp.TenSanPham); } 3.4 Test một Result Action được trả về từ một controller BanHang.TestsControllersSanPhamControllerTest.cs [TestMethod] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("D:@Projects@TestHiTestBanHangBanHang", "/")] [UrlToTest("http://localhost:2430/")] public void TestResultAction() { // // TODO: Add test logic here // var controller = new BanHang.Controllers.SanPhamController(); var result = (RedirectToRouteResult)controller.ChiTietSanPham(-1); Assert.AreEqual("Index", result.Values["action"]); } 4 Tài liệu tham khảo http://asp.net/mvc http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post- scenarios.aspx