diff --git "a/\344\274\215\345\255\246\345\206\233/20260112-MVC.md" "b/\344\274\215\345\255\246\345\206\233/20260112-MVC.md" new file mode 100644 index 0000000000000000000000000000000000000000..561dda4b01f7b948fb08f43b6e617f8e6b53d160 --- /dev/null +++ "b/\344\274\215\345\255\246\345\206\233/20260112-MVC.md" @@ -0,0 +1,35 @@ +## 笔记 + +```bash +app.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); +``` + +- 路由模板解释: + - {controller}:控制器名(去掉Controller后缀) + - {action}:动作方法名 + - {id?}:可选参数,? 表示可选 + + + - 路由模板解释: + - {controller}:控制器名(去掉Controller后缀) + - {action}:动作方法名 + - {id?}:可选参数,? 表示可选 + + +- 可以在控制器或动作方法上使用 [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() { ... } +} +``` \ No newline at end of file diff --git "a/\344\274\215\345\255\246\345\206\233/20260114-MVC\346\226\260\345\242\236.md" "b/\344\274\215\345\255\246\345\206\233/20260114-MVC\346\226\260\345\242\236.md" new file mode 100644 index 0000000000000000000000000000000000000000..b882eaa51e5abe77fbad7964a103394443730c82 --- /dev/null +++ "b/\344\274\215\345\255\246\345\206\233/20260114-MVC\346\226\260\345\242\236.md" @@ -0,0 +1,46 @@ +## 笔记 + +### 新增功能分析 + - 点击新增按钮,跳转到一个页面A + - 使用a标签代替原来的新增按钮,有如下几种方式 + - 新增 + - 新增 + - 在页面A中是一个表单,有若干表单项,有一个提交按钮,有一个取消按钮 + -
+ + - 表单项asp-for和模型绑定 + - 点击提交时,将表单数据保存到数据库表,(成功)后跳转回列表 + - List list list.Add + - 点击取消按钮,跳转回列表页 + +``` +视图层(View):新增按钮(a 标签实现,两种方式) + - 推荐:使用 ASP.NET Core 内置标签助手(自动解析路由,无需硬编码URL,更灵活) + ```html + 新增 + ``` + - 备选:直接硬编码 URL 路径(路径格式:`/控制器名/Action方法名`) + ```html + 新增 + ``` +### 删除 + + [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/\344\274\215\345\255\246\345\206\233/20260115-MVC.md" "b/\344\274\215\345\255\246\345\206\233/20260115-MVC.md" new file mode 100644 index 0000000000000000000000000000000000000000..3b37d02d2aee983b2f7aa25628c317f91198338e --- /dev/null +++ "b/\344\274\215\345\255\246\345\206\233/20260115-MVC.md" @@ -0,0 +1,39 @@ +## 笔记 + + +### 删除功能 + +``` +点击删除按钮,跳转一个页面B +页面B中,有提示,询问要不要删除 +询问要不要删除 +如果是,则删除后返回列表页 +如果不是,则直接返回列表页 +``` + +``` +[HttpPost, ActionName("Delete")] +[ValidateAntiForgeryToken] +public async Task DeleteConfirmed(int id) // 断点3:确认要删除的id +``` + + +### 编辑功能分析 +``` +点击编辑按钮,跳转一个页面C +在页面C中有展示表单,表单中有原来的数据 +在页面C中,有保存,有取消 +点击保存,则将当前新数据保存到数据库,然后跳转回列表页 +点击取消,则跳转回列表页 +``` +``` +public IActionResult Edit(int id) +{ + // 1. 根据ID从模拟集合(或数据库)中查询对应的实体对象 + var targetModel = 命名List.Find(v => v.Id == id); // Find方法:根据主键ID查找匹配项 + + // 2. 合法性校验:判断查询结果是否为空(避免ID无效导致报错) + // 若为空返回404 NotFound,若不为空将实体数据传递给编辑视图(用于表单回显) + return targetModel == null ? NotFound() : View(targetModel); +} +``` \ No newline at end of file diff --git "a/\344\274\215\345\255\246\345\206\233/20260116-MVC\351\242\230\347\233\256.md" "b/\344\274\215\345\255\246\345\206\233/20260116-MVC\351\242\230\347\233\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..fe9c8a5152e4c995b95dc2f2d362300219676934 --- /dev/null +++ "b/\344\274\215\345\255\246\345\206\233/20260116-MVC\351\242\230\347\233\256.md" @@ -0,0 +1,25 @@ +## 笔记 + +### (一)新增功能 +1. 触发跳转:点击页面中的「新增」按钮,将跳转至数据录入页面A;其中「新增」按钮采用 `` 标签实现,有两种常用写法: + - 基于 ASP.NET Core 标签助手(推荐,支持路由自动解析,无需硬编码URL): + ```html + 新增 + ``` + - 基于硬编码 URL(简单直接,路由变更时需手动修改): + ```html + 新增 + ``` + + + 2. 页面A核心内容:包含一个数据录入表单,表单内有若干表单项、「提交」按钮和「取消」按钮。 + - 表单配置(指定提交目标与请求方式): + ```html +
+ ``` + - 表单项绑定:使用 `asp-for` 标签助手实现表单与后台模型的自动绑定,简化数据接收与验证。 +3. 按钮功能逻辑: + - 提交按钮:点击后将表单数据通过 `POST` 请求提交至后台,后台将数据保存到数据库表(通过集合 `List` 的 `list.Add()` 方法添加数据),保存成功后跳转回数据列表页。 + - 取消按钮:点击后直接跳转回数据列表页,不执行任何数据保存操作。 + +