You are on page 1of 16

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êụ trong MVC .................................................................................................. 5
3 Xây dựng quy trin ̀ h test trong ứng du ̣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
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 Models\DataClasses.cs thực hiê ̣n ghi nhâ ̣n thêm mới vào cơ sở dữ liê ̣u.
Models\DataClasses.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 2
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 3
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.
Views\SanPham\ThemMoiSanPham.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 4
<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


̉ i dữ liê
̉ a đô
2 Sư ̣ u trong MVC
Thay đổ i danh sách hiể n thi ̣sản phẩ m cho phép câ ̣p nhâ ̣t dữ liê ̣u
Views\SanPham\DanhSachSanPham.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 5
</asp:Content>
Danh sách sản phẩ m bây giờ có thêm mô ̣t actionlink “Edit” bên ca ̣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 Controllers\SanPhamController.cs
Controllers\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);


}

Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 6
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 7
Trong lớp Controllers \SanPhamController.cs đă ̣t con trỏ chuô ̣t bên ca ̣nh phương thức
CapNhatSanPham, click phải chuô ̣t cho ̣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 cho ̣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 Views\SanPham\CapNhatSanPham.aspx (Figure 5)

Figure 5. Tạo view CapNhatSanPham từ controller CapNhatSanPham


Sau khi ta ̣o xong ta sẽ có mô ̣t Views\SanPham\CapNhatSanPham.aspx như sau:

Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 8
<%@ 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>

̣ ng quy trình test trong ứ ng du


3 Xây 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 9
Figure 6. Ứng dụng test được tạo

3.1 Tạo một controller để test.

Xét lớp Controllers\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()


{

Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 10
// 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 11
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update()
{
//UpdateModel(sp,FormCollection.KeysCollection);
return RedirectToAction("DanhMucLoaiSanPham");
}

}
}
Xây dựng một lớp test cho Controllers\SanPhamController.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 12
BanHang.Tests\Controllers\SanPhamControllerTest.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 13
#endregion

/// <summary>
///A test for ChiTietSanPham
///</summary>
[TestMethod()]
[HostType("ASP.NET")]

[AspNetDevelopmentServerHost("D:\\@Projects\\@Test\\HiTest\\BanHang\\BanHang",
"/")]
[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.Tests\Controllers\SanPhamControllerTest.cs

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("D:\\@Projects\\@Test\\HiTest\\BanHang\\BanHang",
"/")]
[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 14
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.Tests\Controllers\SanPhamControllerTest.cs
[TestMethod]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("D:\\@Projects\\@Test\\HiTest\\BanHang\\BanHang",
"/")]
[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 15
{
//
// 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.Tests\Controllers\SanPhamControllerTest.cs
[TestMethod]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("D:\\@Projects\\@Test\\HiTest\\BanHang\\BanHang",
"/")]
[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

Microsoft Vietnam – DPE Team |Bài số 5: Chỉnh sửa dữ liệu với MVC 16

You might also like