From fae22545fa1f3c9f2242643e9efb982c65b7a419 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, 25 Jan 2026 21:40:00 +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 --- .../20260119-mvc.md" | 41 +++++++ .../20260121-mvc.md" | 61 +++++++++++ .../20260122-mvc.md" | 102 ++++++++++++++++++ .../20260123-mvc.md" | 15 +++ 4 files changed, 219 insertions(+) create mode 100644 "\345\274\240\345\207\257\347\202\230/20260119-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260121-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260122-mvc.md" create mode 100644 "\345\274\240\345\207\257\347\202\230/20260123-mvc.md" diff --git "a/\345\274\240\345\207\257\347\202\230/20260119-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260119-mvc.md" new file mode 100644 index 0000000..fd4c69b --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260119-mvc.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\274\240\345\207\257\347\202\230/20260121-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260121-mvc.md" new file mode 100644 index 0000000..cbeef08 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260121-mvc.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:已删除 \ No newline at end of file diff --git "a/\345\274\240\345\207\257\347\202\230/20260122-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260122-mvc.md" new file mode 100644 index 0000000..119b072 --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260122-mvc.md" @@ -0,0 +1,102 @@ +## 笔记 + +## MVC 更新与删除操作对比笔记 + +### 🔄 **更新操作 (Update)** + +**两步流程**:先GET加载表单 → 再POST提交更新 + +```csharp +// 1. 加载编辑表单(GET) +public IActionResult Edit(int id) +{ + var item = _repository.GetById(id); + return View(item); +} + +// 2. 处理更新提交(POST) +[HttpPost] +public async Task Edit(int id, Product model) +{ + if (ModelState.IsValid) + { + await _repository.UpdateAsync(id, model); + return RedirectToAction(nameof(Index)); + } + return View(model); +} +``` + +**特点**: + +- 需要先查询要更新的数据 +- 乐观锁处理并发更新 +- 部分更新 vs 完全替换 +- 更新日志记录 + +## 🗑️ **删除操作 (Delete)** + +**安全考虑**:确认机制防止误操作 + +```csharp +// 1. 显示确认页(GET) +public IActionResult Delete(int id) +{ + var item = _repository.GetById(id); + return View(item); // 显示确认信息 +} + +// 2. 执行删除(POST) +[HttpPost, ActionName("Delete")] +public async Task DeleteConfirmed(int id) +{ + await _repository.DeleteAsync(id); + return RedirectToAction(nameof(Index)); +} +``` + +### ⚠️ **核心差异对比** + +| 方面 | 更新操作 | 删除操作 | +| ------------ | ---------------- | -------------- | +| **HTTP方法** | GET + POST | GET + POST | +| **数据影响** | 修改现有数据 | 移除数据 | +| **可逆性** | 可回滚 | 通常不可逆 | +| **级联影响** | 可能影响关联数据 | 需处理外键约束 | +| **验证重点** | 新数据有效性 | 删除权限与条件 | + +### 🛡️ **安全与数据完整性** + +**更新注意事项**: + +1. 防止越权更新(检查所有者) +2. 敏感字段保护(如密码、权限) +3. 版本控制(ETag/时间戳) + +**删除注意事项**: + +1. **软删除** vs **硬删除** +2. 删除前检查关联数据 +3. 审计日志记录(谁、何时删除) + +**通用原则**: + +- POST重定向GET(PRG模式) +- 防CSRF令牌 +- 操作前的用户确认 +- 友好的错误反馈 + +## 📋 **最佳实践** + +1. **更新**: + - 使用部分更新减少数据传输 + - 提供撤销功能(最近更改) + - 显示修改前后的差异对比 + +2. **删除**: + - 默认软删除,定期清理 + - 回收站机制 + - 批量删除的进度提示 + +更新关注数据**修正**,删除关注数据**生命周期结束**,两者都需要比创建操作更多的安全考虑。 + diff --git "a/\345\274\240\345\207\257\347\202\230/20260123-mvc.md" "b/\345\274\240\345\207\257\347\202\230/20260123-mvc.md" new file mode 100644 index 0000000..215ccde --- /dev/null +++ "b/\345\274\240\345\207\257\347\202\230/20260123-mvc.md" @@ -0,0 +1,15 @@ +## 笔记 +查找功能 + +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