From 7cde5115ac6f4c5802abd773960f53239ed2da99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=86=B0?= <3355703905@qq.com> Date: Mon, 19 Jan 2026 02:49:01 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E5=BE=90=E5=86=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 徐冰 <3355703905@qq.com> --- "\345\276\220\345\206\260/20260112.md" | 10 ++++++++ "\345\276\220\345\206\260/20260114.md" | 27 ++++++++++++++++++++ "\345\276\220\345\206\260/20260115.md" | 31 +++++++++++++++++++++++ "\345\276\220\345\206\260/20260116.md" | 34 ++++++++++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 "\345\276\220\345\206\260/20260112.md" create mode 100644 "\345\276\220\345\206\260/20260114.md" create mode 100644 "\345\276\220\345\206\260/20260115.md" create mode 100644 "\345\276\220\345\206\260/20260116.md" diff --git "a/\345\276\220\345\206\260/20260112.md" "b/\345\276\220\345\206\260/20260112.md" new file mode 100644 index 0000000..fc19bb9 --- /dev/null +++ "b/\345\276\220\345\206\260/20260112.md" @@ -0,0 +1,10 @@ +默认路由规则(在 Program.cs 中配置): + +app.MapControllerRoute( +name: "default", +pattern: "{controller=Home}/{action=Index}/{id?}"); +模板解释: + +{controller}:控制器名(去掉Controller后缀) +{action}:动作方法名 +{id?}:可选参数,? 表示可选 \ No newline at end of file diff --git "a/\345\276\220\345\206\260/20260114.md" "b/\345\276\220\345\206\260/20260114.md" new file mode 100644 index 0000000..7876950 --- /dev/null +++ "b/\345\276\220\345\206\260/20260114.md" @@ -0,0 +1,27 @@ +MVC新增功能实现: 关键:必须做前后端双重数据校验,确保数据合法性,新增后需给用户明确的结果反馈。 + +public async Task Create([Bind("Id,Name,Age")] Student student)| +{ +if (ModelState.IsValid) // 断点1:检查模型验证是否通过| +{ +_context.Add(student); // 断点2:检查要新增的student数据| +await _context.SaveChangesAsync(); // 断点3:执行数据库保存| +return RedirectToAction(nameof(Index)); +} +return View(student); +} +MVC删除功能实现: 关键:优先增加确认环节防误删,推荐使用 “软删除”,删除操作必须基于唯一主键,同时处理关联数据的异常情况。 + +public async Task Delete(int? id) +{ +if (id == null \_context.Student == null) +{ +return NotFound(); +} +var student = await _context.Student.FirstOrDefaultAsync(m => m.Id == id); +if (student == null) +{ +return NotFound(); +} +return View(student); +} \ No newline at end of file diff --git "a/\345\276\220\345\206\260/20260115.md" "b/\345\276\220\345\206\260/20260115.md" new file mode 100644 index 0000000..aa1e773 --- /dev/null +++ "b/\345\276\220\345\206\260/20260115.md" @@ -0,0 +1,31 @@ +/ 查找功能 + + // IsNullOrEmpty方法用于判断字符串是否为null或空字符串("") + + // AsQueryable方法将一个IEnumerable转换为IQueryable + + public ActionResult Index(string searchName = "") + { + var res = vipList.AsQueryable(); + if (!string.IsNullOrEmpty(searchName)) + { + res = res.Where(v => v.Name.Contains(searchName)); + } + return View(res.ToList()); + + }/ 查找功能 + + // IsNullOrEmpty方法用于判断字符串是否为null或空字符串("") + + // AsQueryable方法将一个IEnumerable转换为IQueryable + + public ActionResult Index(string searchName = "") + { + var res = vipList.AsQueryable(); + if (!string.IsNullOrEmpty(searchName)) + { + res = res.Where(v => v.Name.Contains(searchName)); + } + return View(res.ToList()); + + } \ No newline at end of file diff --git "a/\345\276\220\345\206\260/20260116.md" "b/\345\276\220\345\206\260/20260116.md" new file mode 100644 index 0000000..cac214d --- /dev/null +++ "b/\345\276\220\345\206\260/20260116.md" @@ -0,0 +1,34 @@ +编辑功能的实现: + + // 编辑功能 + public ActionResult Edit(int id) + { + var vip = vipList.FirstOrDefault(v => v.id == id); + if (vip == null) + { + return NotFound(); + } + return View(vip); + } + + [HttpPost] + public ActionResult Edit(Vipinfo vip) + { + // ModelState.IsValid用于模型绑定和验证是否通过 + if (ModelState.IsValid) + { + var existingVip = vipList.FirstOrDefault(v => v.id == vip.id); + if (existingVip != null) + { + existingVip.Name = vip.Name; + + existingVip.Birthday = vip.Birthday; + + existingVip.Score = vip.Score; + + existingVip.Gender = vip.Gender; + } + return RedirectToAction("index"); + } + return View(vip); + } \ No newline at end of file -- Gitee From ef9febb5e72fffae5284dd100ab62c6143764c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=86=B0?= <3355703905@qq.com> Date: Sun, 25 Jan 2026 05:13:00 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E5=BE=90=E5=86=B027?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 徐冰 <3355703905@qq.com> --- .../20260119-\344\275\234\344\270\232.md" | 41 +++++++++++ .../20260121-\344\275\234\344\270\232.md" | 61 ++++++++++++++++ .../20260122-\344\275\234\344\270\232.md" | 70 +++++++++++++++++++ .../20260123-\344\275\234\344\270\232.md" | 20 ++++++ 4 files changed, 192 insertions(+) create mode 100644 "\345\276\220\345\206\260/20260119-\344\275\234\344\270\232.md" create mode 100644 "\345\276\220\345\206\260/20260121-\344\275\234\344\270\232.md" create mode 100644 "\345\276\220\345\206\260/20260122-\344\275\234\344\270\232.md" create mode 100644 "\345\276\220\345\206\260/20260123-\344\275\234\344\270\232.md" diff --git "a/\345\276\220\345\206\260/20260119-\344\275\234\344\270\232.md" "b/\345\276\220\345\206\260/20260119-\344\275\234\344\270\232.md" new file mode 100644 index 0000000..6bfb657 --- /dev/null +++ "b/\345\276\220\345\206\260/20260119-\344\275\234\344\270\232.md" @@ -0,0 +1,41 @@ +### 笔记 + +1.创建模型类 + + 基本模型类:模型类通常放在Models文件夹中,是普通的C#类。 + 示例:Student.cs + + ```bash + namespace StudentManagementSystem.Models + { + public class Student + { + public int Id { get; set; } + public string Name { get; set; } + public int Age { get; set; } + public string Email { get; set; } + public DateTime EnrollmentDate { get; set; } + public string Major { get; set; } + } + } + ``` + +2. 什么是模型绑定? + + - 模型绑定是ASP.NET Core将HTTP请求数据自动映射到控制器动作参数的过程。 + + - 绑定来源: + - 路由数据(Route data) + - 查询字符串(Query string) + - 表单数据(Form data) + - JSON/XML请求体 + + - 绑定特性 + ```bash + // 指定绑定来源 + [FromQuery] // 从查询字符串绑定 + [FromRoute] // 从路由数据绑定 + [FromForm] // 从表单数据绑定 + [FromBody] // 从请求体绑定(JSON/XML) + [FromHeader] // 从请求头绑定 + [FromServices] // 从依赖注入容器绑定服务 \ No newline at end of file diff --git "a/\345\276\220\345\206\260/20260121-\344\275\234\344\270\232.md" "b/\345\276\220\345\206\260/20260121-\344\275\234\344\270\232.md" new file mode 100644 index 0000000..39baab3 --- /dev/null +++ "b/\345\276\220\345\206\260/20260121-\344\275\234\344\270\232.md" @@ -0,0 +1,61 @@ +### 笔记 +1. EF Core的工作方式 + + - Code First:先写代码(模型),再生成数据库(我们采用的方式) + - Database First:已有数据库,根据数据库生成代码 + - Model First:先设计模型图,再生成代码和数据库 + +2. 迁移(Migration) + + - 安装EF Core工具(如果尚未安装)`dotnet tool install --global dotnet-ef` + + - 创建迁移`dotnet ef migrations add InitialCreate` + + - 应用迁移到数据库`dotnet ef database update` + + - 删除最近一次迁移`dotnet ef migrations remove` + + - 生成SQL脚本(不执行)`dotnet ef migrations script` + + - 更新到特定迁移`dotnet ef database update TargetMigration` + +3. 使用DbContext进行数据操作 + + - 新增(Create): + + ```bash + var student = new Student { Name = "张三", Age = 20 }; + context.Students.Add(student); + await context.SaveChangesAsync(); + ``` + + - 读取(Read): + + ```bash + var student = await context.Students.FindAsync(id); // 按主键查找 + var students = await context.Students.Where(s => s.Age > 18).ToListAsync(); + ``` + + - 更新(Update): + + ```bash + student.Name = "李四"; + context.Students.Update(student); + await context.SaveChangesAsync(); + ``` + + - 删除(Delete): + + ```bash + context.Students.Remove(student); + await context.SaveChangesAsync(); + + ``` + +- 状态 + + - Detached:未跟踪 + - Added:已添加,但未保存 + - Unchanged:未修改 + - Modified:已修改 + - Deleted:已删除 diff --git "a/\345\276\220\345\206\260/20260122-\344\275\234\344\270\232.md" "b/\345\276\220\345\206\260/20260122-\344\275\234\344\270\232.md" new file mode 100644 index 0000000..8de26ac --- /dev/null +++ "b/\345\276\220\345\206\260/20260122-\344\275\234\344\270\232.md" @@ -0,0 +1,70 @@ +### 笔记 +1. 步骤1:安装2个包 + + 1. 安装EF Core SQLite提供程序(`Microsoft.EntityFrameworkCore.Sqlite`) + + - `dotnet add package Microsoft.EntityFrameworkCore.Sqlite -v 8.0` + + 2. 安装EF Core设计工具(用于迁移)(Microsoft.EntityFrameworkCore.Design) + + - `dotnet add package Microsoft.EntityFrameworkCore.Design -v 8.0` + +2. 步骤2:定义数据库上下文 + + 1. 定义数据库 + + - `public Dbset 名称{get;set}` + + 2. 配置数据库连接字符串 + +3. 步骤3:执行数据库迁移 + + 1. 2个先决条件 + + - 不能眼编译错误 + - 项目没有在运行,不在运行状态 + + 2. 命令 + + - `dotnet ef migrations add XXX` + + 3. 如果没有安装ef工具,使用如下命令 + + - `dotnet tool install --global dotnet-ef` + +4. 步骤4:将迁移文件更新应用到数据库 + + - `dotnet er database update` + +5. 步骤5:在控制器中使用数据库撒花姑娘下文进行CRUD + + - 新增(Create): + + ```bash + var student = new Student { Name = "张三", Age = 20 }; + context.Students.Add(student); + await context.SaveChangesAsync(); + ``` + + - 读取(Read): + + ```bash + var student = await context.Students.FindAsync(id); // 按主键查找 + var students = await context.Students.Where(s => s.Age > 18).ToListAsync(); + ``` + + - 更新(Update): + + ```bash + student.Name = "李四"; + context.Students.Update(student); + await context.SaveChangesAsync(); + ``` + + - 删除(Delete): + + ```bash + context.Students.Remove(student); + await context.SaveChangesAsync(); + + ``` diff --git "a/\345\276\220\345\206\260/20260123-\344\275\234\344\270\232.md" "b/\345\276\220\345\206\260/20260123-\344\275\234\344\270\232.md" new file mode 100644 index 0000000..4ff04ac --- /dev/null +++ "b/\345\276\220\345\206\260/20260123-\344\275\234\344\270\232.md" @@ -0,0 +1,20 @@ +### 笔记 +查找功能 + +```bash +public IActionResult Index(string keyword) + { + // 直接使用数据库表中的数据 + IEnumerable list = db.Products; + + // 当keyword不为空时,在数据库表中查找关键内容 + if (!string.IsNullOrEmpty(keyword)) + { + list = list.Where(p => p.ProductName.Contains(keyword) || p.Tag.Contains(keyword)); + } + return View(list); + } +``` + +### 练习 +无 \ No newline at end of file -- Gitee