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 Sa đổi d liê ̣u trong MVC .................................................................................................. 5 3 Xây dng quy tri ̀ nh 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 Ti liu tham kho ............................................................................................................... 16

Aspnet 3.5 _05

Embed Size (px)

Citation preview

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 trinh test trong ưng dung 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 Tai liêu tham khao ............................................................................................................... 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 Models\DataClasses.cs thưc hiên ghi nhân thêm mơi vao 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 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 nut đê

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"] = "San phâm";

return RedirectToAction("DanhMucLoaiSanPham");

}

public ActionResult DanhMucLoaiSanPham()

{

// Code cua ban o day

ViewData["Title"] = "Danh muc loai san phâm";

List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList();

return View("DanhMucLoaiSanPham", lsp);

}

public ActionResult DanhSachSanPham(int id)

{

ViewData["Title"] = "Danh sach san phâm trong loai san 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 san phâm";

SanPham ctsp = data.LaySanPhamTuID(id);

return View("ChiTietSanPham", ctsp);

}

public ActionResult ThemMoiSanPham()

{

ViewData["Title"] = "Thêm mới san 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 san 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 san 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 san phâm"

/></td>

</tr>

</table>

</form>

</asp:Content>

Thưc thi se cho ra kêt qua như sau (figure 2)

Figure 2. Thưc hiên thêm mơi san phâm trong MVC

2 Sư a đô i dư liê u trong MVC Thay đôi danh sach hiên thi san phâm cho phep 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 la danh sach san phâm co trong chuyên muc</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 san 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 sach san phâm bây giơ co thêm môt actionlink “Edit” bên canh môi san phâm đê ngươi dung

tương tac vơi chưc năng câp nhât dư liêu san phâm. (figure 3)

Figure 3. Danh sach san phâm đa đươc thay đôi.

Thêm 2 phương thưc CapNhatSanPham va 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"] = "San phâm";

return RedirectToAction("DanhMucLoaiSanPham");

}

public ActionResult DanhMucLoaiSanPham()

{

// Code cua ban o day

ViewData["Title"] = "Danh muc loai san 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 sach san phâm trong loai san 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 san phâm";

SanPham ctsp = data.LaySanPhamTuID(id);

return View("ChiTietSanPham", ctsp);

}

public ActionResult ThemMoiSanPham()

{

ViewData["Title"] = "Thêm mới san 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 san 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 Controllers \SanPhamController.cs đăt con tro chuôt bên canh phương thưc

CapNhatSanPham, click phai chuôt chon Add View (figure 4)

Figure 4. Thêm mơi view cho phương thưc CapNhatSanPham

Thiêt lâp cac thuôc tinh sau: Đanh dâu chon vao checkbox “Created a strongly typed view”, chon thuộc

tinh cua View content là Edit, chon thuộc tinh cua View data class là BanHang.Models.SanPham rôi ân

nut Add để thêm vào Views\SanPham\CapNhatSanPham.aspx (Figure 5)

Figure 5. Tao view CapNhatSanPham tư controller CapNhatSanPham

Sau khi tao xong ta se co 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 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 trinh test trong ưng du 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 tao

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"] = "San 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 muc loai san phâm";

List<LoaiSanPham> lsp = data.LoaiSanPhams.ToList();

return View("DanhMucLoaiSanPham", lsp);

}

public ActionResult DanhSachSanPham(int id)

{

ViewData["Title"] = "Danh sach san phâm trong loai san 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 san phâm";

SanPham ctsp = data.LaySanPhamTuID(id);

return View("ChiTietSanPham", ctsp);

}

public ActionResult ThemMoiSanPham()

{

ViewData["Title"] = "Thêm mới san 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 san 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 Controllers\SanPhamController.cs ở trên, tạo SanPhamControllerTest.cs từ

folder Controllers cua projects chon 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.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 14

#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ó đung không và khi nào thì nó được goi đến, phương thức nào cua

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 chon 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.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 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.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