ASP.NET - MVC - Phương thức Delete

Tìm hiểu 2 phương thức Delete Và View Delete

Bây giờ, chúng ta ta chuyển sang tìm hiểu phương thức Delete cũng như View của nó. Đúng như tên gọi, Delete (xóa) là phương thức dễ hiểu nhất, vì thông thường “phá dễ hơn làm”. Nếu bạn đã học về cơ sở dữ liệu và có một sự quan sát tinh tế về lập trình Web thì thao tác xóa ở Web thường xóa theo chỉ số ID (hay khóa chính) chứ không phải theo bất cứ trường nào khác. Lưu ý xóa theo chỉ số ID với lập trình Web là nguyên tắc chung áp dụng cho tất cả các ngôn ngữ Web (PHP, Perl, JSP) chứ không riêng gì ASP.NET MVC.

1. Tùy chỉnh lại View

Từ trang Index.cshtml. Sau đó, nhấp liên kết Xóa trên giao diện Web để đi đến trang xóa với liên kết http://localhost:xxxx/Book/Delete/13:

Ngoài việc tùy chỉnh tiếng Anh thành tiếng Việt cho Form xóa ta còn tùy chỉnh một số thẻ sau:

Để hiển thị hình chúng ta sẽ thay đổi @Html.DisplayFor(model => model.Images) thành <img src="~/bookimages/@Model.Images" />

 <dd>
       <img src="~/bookimages/@Model.Images" />
</dd>

Ở  phần mô tả nội dung hiển thị luôn các thẻ html. Chúng ta sẽ đổi @Html.DisplayFor(model => model.Description) thành @Html.Raw(Model.Description)

<dd>
    @Html.Raw(Model.Description)
</dd>

Mã nguồn trang Delete.cshtml sau khi tùy chỉnh:

@model BookStoreManager.Models.Book

@{
    ViewBag.Title = "Delete";
    Layout = "~/Views/Shared/_Layout.cshtml";
}



<h3>Bạn có muốn xóa quyển sách này?</h3>
<div>
   
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Price)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Price)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Images)
        </dt>

        <dd>
            <img src="~/bookimages/@Model.Images" />
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Description)
        </dt>

        <dd>
            @Html.Raw(Model.Description)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Published)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Published)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.ViewCount)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.ViewCount)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Author.AuthorName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Author.AuthorName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Category.CategoryName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Category.CategoryName)
        </dd>

    </dl>

    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()

        <div class="form-actions no-color">
            <input type="submit" value="Xóa" class="btn btn-default" /> |
            @Html.ActionLink("Quay về danh sách", "Index")
        </div>
    }
</div>

Trong đoạn mã, bạn có thể xem giao diện trước khi xóa để xác nhận xóa. Bạn có thể thay đổi thông điệp “Bạn có muốn xóa quyển sách này?” nếu muốn. Tương tự các phương thức khác, ở View Delete cũng dùng @Html.AntiForgeryToken() để tạo 1 token bảo mật cho thao tác xóa.

Từ trang Index.cshtml. Sau đó, nhấp liên kết Xóa trên giao diện Web để đi đến trang chỉnh sửa liên kết http://localhost:xxxx/Book/Delete/13 sẽ gọi public ActionResult Delete(int? id) trong controller BookController.cs Cho kết quả sau khi tùy chỉnh Delete.cshtml.

Mã nguồn của đường dẫn http://localhost:xxxx/Book/Delete/13

<form action="/Book/Delete/13" method="post"><input name="__RequestVerificationToken" type="hidden" value="HTCIZ4mOR5-AvnLI35LhUcEErMU9-m1JbJdY1C7pjC2dBIdVAB6bDevJFh2rBk_J8GX-tmb5bXctquvYsuo7XrkqakEJCNZS02BeJxKN0lE1" />        <div class="form-actions no-color">
            <input type="submit" value="Xóa" class="btn btn-default" /> |
            <a href="/">Quay về danh s&#225;ch</a>
        </div>
</form></div>

Xem mã nguồn ta sẽ thấy trong thuộc tính action của form có giá trị action="/Book/Delete/13". Khi người sử dụng click vào nút "xóa" phía client gửi lên server gồm: Controller là Book, Action là Delete, IDBook là 13


2. Phương thức Delete

Mở tập tin BookController.cs. Tiếp theo chúng ta sẽ xử lý trong Controller như sau, tìm đến hai phương thức Delete():

2.1 Phương thức Delete dạng GET

// GET: Book/Delete/5
public ActionResult Delete(int? id)
{
  if (id == null)
  {
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
  }
  Book book = db.Books.Find(id);
  if (book == null)
  {
     return HttpNotFound();
  }
   return View(book);
}

Phương thức Delete(int? id) dùng để hiện thị thông tin sách bất kỳ theo chỉ số ID. Trong phương thức này, có thể kiểm tra xem giá trị đầu vào null hay không, nếu không thì dùng phương thức Find để tìm đối tượng Book có trong database theo ID hay không, nếu có thì hiển thị , không thì trả về phương thức HttpNotFound(), tức là không tìm thấy.

2.2 Phương thức Delete dạng POST

// POST: Book/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
  Book book = db.Books.Find(id);
  db.Books.Remove(book);
  db.SaveChanges();
  return RedirectToAction("Index");
}

Click người sử dụng click vào nút "xóa" trên form xóa sẽ gọi đến phương thức DeleteConfirmed(int id) để xóa.