Bài 1: Giới thiệu về Trình quản lý quảng cáo

🧠 BÀI GIẢNG: THÊM MỚI DỮ LIỆU BẰNG ENTITY FRAMEWORK (.NET 8 MVC)

🧩 1. Tạo hàm lưu trong class KhoaHocService

Tạo class service để xử lý nghiệp vụ:

// Services/KhoaHocService.cs
using MyProject.Models.Entity;

namespace MyProject.Services
{
    public class KhoaHocService
    {
        private readonly  WebDaoTaoContext _context;

        public KhoaHocService(AppDbContext context)
        {
            _context = context;
        }

        // ✅ Hàm lưu mới dữ liệu
        public bool ThemMoi(KhoaHoc model)
        {
            try
            {
                _context.KhoaHoc.Add(model);
                _context.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                // Có thể log lỗi ra file hoặc hệ thống
                Console.WriteLine("Lỗi lưu KhoaHoc: " + ex.Message);
                return false;
            }
        }
    }
}

👉 Giải thích:

  • _context.KhoaHoc.Add(model) thêm bản ghi mới vào context.

  • SaveChanges() ghi thay đổi xuống database.

  • Trả về true/false giúp Controller biết có lưu thành công hay không.


🧭 2. Tạo Controller: KhoaHocController

// Controllers/KhoaHocController.cs
using Microsoft.AspNetCore.Mvc;
using MyProject.Models.Entity;
using MyProject.Services;

namespace MyProject.Controllers
{
    public class KhoaHocController : Controller
    {
        private readonly KhoaHocService _service;

        public KhoaHocController(KhoaHocService service)
        {
            _service = service;
        } 
        // ✅ Hiển thị form thêm mới
        [HttpGet]
        public IActionResult ThemMoi()
        {
            return View();
        }

        // ✅ Action nhận dữ liệu submit từ form
        [HttpPost]
        public IActionResult LuuThemMoi(KhoaHoc model)
        {
            if (ModelState.IsValid)
            {
                bool result = _service.ThemMoi(model);
                if (result)
                {
                    TempData["Success"] = "Thêm mới khóa học thành công!";
                    return RedirectToAction("DanhSach");
                }
                else
                {
                    TempData["Error"] = "Có lỗi xảy ra khi lưu dữ liệu.";
                }
            }

            // Nếu model không hợp lệ hoặc lưu lỗi, quay lại form
            return View(model);
        }

        // ✅ Trang danh sách (để chuyển hướng sau khi thêm)
        public IActionResult DanhSach()
        {
            // Demo: tạm chưa lấy dữ liệu
            return View();
        }
    }
}

👉 Lưu ý đặt tên form:

  • Action [HttpPost] có cùng tên với [HttpGet] (ThemMoi) → MVC sẽ mapping dữ liệu submit tự động thông qua tên thuộc tính (name) trong form.


🧾 3. Tạo View thêm mới (ThemMoi.cshtml)

Đặt tại:
Views/KhoaHoc/ThemMoi.cshtml

@model MyProject.Models.Entity.KhoaHoc
@{
    ViewData["Title"] = "Thêm mới khóa học";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="container mt-4">
    <h3>@ViewData["Title"]</h3>
    <hr />

    @if (TempData["Error"] != null)
    {
        <div class="alert alert-danger">@TempData["Error"]</div>
    }

    @using (Html.BeginForm("LuuThemMoi", "KhoaHoc", FormMethod.Post))
    {
        <div class="form-group mb-3">
            <label for="TenKhoaHoc">Tên khóa học</label>
            @Html.TextBoxFor(m => m.TenKhoaHoc, new { @class = "form-control", placeholder = "Nhập tên khóa học" })
        </div>

        <div class="form-group mb-3">
            <label for="MoTa">Mô tả</label>
            @Html.TextAreaFor(m => m.MoTa, new { @class = "form-control", rows = "4", placeholder = "Nhập mô tả khóa học" })
        </div>

        <div class="form-group mb-3">
            <button type="submit" class="btn btn-primary">
                <i class="bi bi-save"></i> Lưu lại
            </button>
            <a href="@Url.Action("DanhSach", "KhoaHoc")" class="btn btn-secondary">Hủy</a>
        </div>
    }
</div>

👉 Giải thích:

  • Html.BeginForm("ThemMoi", "KhoaHoc", FormMethod.Post) → gửi dữ liệu đến KhoaHocController.ThemMoi([HttpPost]).

  • @Html.TextBoxFor@Html.TextAreaFor tự động bind dữ liệu vào model KhoaHoc.

  • Có nút LưuHủy.


⚙️ Cấu hình khởi tạo service (Dependency Injection)

Thêm vào Program.cs:

builder.Services.AddScoped<KhoaHocService>();

Kết quả chạy thử:

  1. Vào link /KhoaHoc/ThemMoi → form hiện ra.

  2. Nhập tên + mô tả → bấm Lưu lại.

  3. Controller nhận model, gọi service.ThemMoi(model) → thêm vào DB.

  4. Chuyển hướng sang trang danh sách hoặc hiển thị thông báo thành công.

Bài tập số 16: Thêm dữ liệu mới vào cơ sở dữ liệu với LINQ

Yêu cầu:

  • QuanLyDaoTaoDB

  • Thực hành lại nội dung đã học.

  • Làm tương tự với bảng NhanVien, HocVien

Nộp bài:

  • Nén project đã làm và nộp file.