From 3cdbc4f11535a81473a0cf0c3ca7275edc2487d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=87=AF=E7=82=98?= <344917204@qq.com> Date: Sun, 18 Jan 2026 22:57:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=A0=E5=87=AF=E7=82=9807?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20260112-mvc.md" | 37 ++++++++ .../20260114-mvc.md" | 86 +++++++++++++++++++ .../20260115-mvc.md" | 15 ++++ .../20260116-mvc.md" | 63 ++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 "\345\274\240\345\207\257\347\202\230/20260112-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260114-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260115-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260116-mvc.md" diff --git "a/\345\274\240\345\207\257\347\202\230/20260112-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260112-mvc.md" new file mode 100644 index 0000000..340b509 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260112-mvc.md" @@ -0,0 +1,37 @@ +# 笔记 +1. 路由(Routing)(路由是将URL映射到控制器的规则系统。) +- 默认路由规则(在 Program.cs 中配置): +```bash +app.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); +``` +- 路由模板解释: + - {controller}:控制器名(去掉Controller后缀) + - {action}:动作方法名 + - {id?}:可选参数,? 表示可选 + +2. 自定义路由特性 +- 可以在控制器或动作方法上使用 [Route] 特性: +```bash +[Route("api/students")] // 自定义路由 +public class StudentController : Controller +{ + [Route("")] // 对应 /api/students + public IActionResult Index() { ... } + + [Route("{id:int}")] // 对应 /api/students/5 + public IActionResult Details(int id) { ... } + + [Route("add")] // 对应 /api/students/add + public IActionResult Create() { ... } +} +``` +4 路由约束 +- 限制参数的类型和格式: +```bash +[Route("students/{id:int:min(1)}")] // id必须是大于0的整数 +public IActionResult Details(int id) { ... } + +[Route("students/{name:alpha}")] // name只能是字母 +public IActionResult Search(string name) { ... } \ No newline at end of file diff --git "a/\345\274\240\345\207\257\347\202\230/20260114-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260114-mvc.md" new file mode 100644 index 0000000..a6c6758 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260114-mvc.md" @@ -0,0 +1,86 @@ +# 笔记 + +### 新增功能分析 + - 点击新增按钮,跳转到一个页面A + - 使用a标签代替原来的新增按钮,有如下几种方式 + - 新增 + - 新增 + - 在页面A中是一个表单,有若干表单项,有一个提交按钮,有一个取消按钮 + -
+ - 表单项asp-for和模型绑定 + - 点击提交时,将表单数据保存到数据库表,(成功)后跳转回列表 + - List list list.Add + - 点击取消按钮,跳转回列表页 + + + + +- 新增关键:必须做前后端双重数据校验,确保数据合法性,新增后需给用户明确的结果反馈。 +- 删除关键:优先增加确认环节防误删,推荐使用 “软删除”,删除操作必须基于唯一主键,同时处理关联数据的异常情况。 + +```bash +flowchart LR + A[VSCode编写删除按钮+确认弹窗] --> B[Live Server预览确认逻辑] + B --> C[VSCode编写Controller接收删除ID] + C --> D[VSCode编写Model软删除逻辑] + D --> E[VSCode断点调试软删除字段] + E --> F[test.http发送DELETE请求测试] + F --> G[终端查is_deleted字段验证] +``` +1. 新增 +```bash +public IActionResult Create() +{ + return View(); +} + +// POST: 提交新增数据 +[HttpPost] +[ValidateAntiForgeryToken] +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); +} +``` +2. 删除 +```bash +public async Task Delete(int? id) // 断点1:检查传入的id是否正确 +{ + if (id == null || _context.Student == null) + { + return NotFound(); + } + + var student = await _context.Student.FirstOrDefaultAsync(m => m.Id == id); // 断点2:检查查询到的学生数据 + if (student == null) + { + return NotFound(); + } + + return View(student); +} + +// POST: 执行删除 +[HttpPost, ActionName("Delete")] +[ValidateAntiForgeryToken] +public async Task DeleteConfirmed(int id) // 断点3:确认要删除的id +{ + if (_context.Student == null) + { + return Problem("Entity set 'AppDbContext.Student' is null."); + } + var student = await _context.Student.FindAsync(id); + if (student != null) + { + _context.Student.Remove(student); // 断点4:执行删除操作 + } + + await _context.SaveChangesAsync(); // 断点5:提交删除到数据库 + return RedirectToAction(nameof(Index)); +} \ No newline at end of file diff --git "a/\345\274\240\345\207\257\347\202\230/20260115-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260115-mvc.md" new file mode 100644 index 0000000..3034442 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260115-mvc.md" @@ -0,0 +1,15 @@ +# 笔记 + 删除功能分析 + +点击删除按钮,跳转一个页面B +页面B中,有提示,询问要不要删除 +询问要不要删除 +如果是,则删除后返回列表页 +如果不是,则直接返回列表页 +编辑功能分析 + +点击编辑按钮,跳转一个页面C +在页面C中有展示表单,表单中有原来的数据 +在页面C中,有保存,有取消 +点击保存,则将当前新数据保存到数据库,然后跳转回列表页 +点击取消,则跳转回列表页 \ No newline at end of file diff --git "a/\345\274\240\345\207\257\347\202\230/20260116-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260116-mvc.md" new file mode 100644 index 0000000..2d066b8 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260116-mvc.md" @@ -0,0 +1,63 @@ +# 笔记 +# 删除按钮 +## 控制器关键代码(MinController.cs) +``` +// 展示删除确认页(GET) +public IActionResult Del(int Id) +{ + var min = minList.FirstOrDefault(m => m.Id == Id); + if (min == null) return NotFound("数据不存在"); + return View(min); +} + +// 执行删除(POST,防止GET误删) +[HttpPost] +public IActionResult DelConfirmed(int Id) +{ + var delItem = minList.FirstOrDefault(m => m.Id == Id); + if (delItem != null) minList.Remove(delItem); + return RedirectToAction("Index"); +} +``` +## 列表页(Index.cshtml) +``` +@{ + ViewData["Title"] = "初始表格"; +} +
+ + 新增 +
+ + + + + + +@foreach(var item in Model){ + + + + + + +} +
序号小名爱好
@item.Id@item.Name@item.Hobby + + 删除 + +
+``` +## 删除确认页(Del.cshtml) +``` +@{ + ViewData["Title"] = "删除确认"; +} + +

确定要删除【@Model.Name】吗?

+ + +
+ + 取消 +
\ No newline at end of file -- Gitee