From 42ad3afccaf7f276a387680b840dc3feaf7507ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com> Date: Sun, 8 Dec 2024 17:59:05 +0800 Subject: [PATCH 1/4] =?UTF-8?q?12.04=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\231\244,\346\237\245\346\211\276).md" | 185 +++++++++++++++++ ...6\346\210\220\346\237\245\350\257\242).md" | 193 ++++++++++++++++++ 2 files changed, 378 insertions(+) create mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" create mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" new file mode 100644 index 0000000..13031e0 --- /dev/null +++ "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" @@ -0,0 +1,185 @@ +## 删除操作 + +### 控制器中的处理逻辑 + +#### 1. 渲染删除页面 +- **操作**:根据传入的 `id` 在数据库表中查找对应记录。 +- **逻辑**: + - 如果找到记录,则返回元素供用户确认删除。 + - 如果找不到记录,则提示用户目标不存在。 +- **示例代码**: + ```cs + public IActionResult Delete(int id) + { + var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); + if (blog != null) + { + return View(blog); + } + return View(); + } + ``` + +#### 2. 执行删除操作 +- **操作**:再次通过 `id` 查找记录,找到后执行删除。 +- **示例代码**: + ```cs + public IActionResult DeleteOther(int id) + { + var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); + if (blog != null) + { + Db.Blogs.Remove(blog); + } + return RedirectToAction("Index"); + } + ``` + +--- + +### 视图中的实现 + +1. **展示要删除的记录**:页面显示记录的详细信息。 +2. **确认删除**:提供跳转链接,执行实际删除操作。 + ```html + 删除 + ``` +3. **取消操作**:返回首页。 + ```html + 取消删除 + ``` + +--- + +## 查找功能 + +### 视图层实现 + +1. **添加搜索框**:在主页视图中加入表单,连接到控制器的 `Index` 方法。 + ```html +
+ + +
+ ``` + +### 控制器逻辑 + +1. **处理搜索请求**: + - 判断是否有关键字输入。 + - 如果没有关键字,则显示所有内容。 + - 如果有关键字,则匹配相关数据并返回结果。 + ```cs + public IActionResult Index(string keyword) + { + if (string.IsNullOrEmpty(keyword)) + { + return View(Db.Blogs); + } + else + { + var list = Db.Blogs + .Where(x => x.Title.Contains(keyword) || x.Content.Contains(keyword) || x.Author.Contains(keyword)) + .ToList(); + return View(list); + } + } + ``` + +--- + +## LINQ 查询与 Lambda 表达式 + +### 基础操作示例 + +1. **查询特定元素**:获取数组中等于 5 的值。 + ```cs + var result = numbers.Where(x => x == 5); + ``` + +2. **筛选范围元素**:找出 2 到 8 之间的数字。 + ```cs + var result = numbers.Where(x => x > 2 && x < 8); + ``` + +3. **数据转换**:将数组中的每个数字乘以 2。 + ```cs + var result = numbers.Select(x => x * 2); + ``` + +4. **筛选特定属性**:获取名字以“王”开头的学生。 + ```cs + var result = students.Where(x => x.Name.StartsWith("王")); + ``` + +5. **排序**:找出年龄大于 20 的学生并按年龄降序排列。 + ```cs + var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age); + ``` + +6. **去重**:获取数组中所有不重复的数字。 + ```cs + var result = numbers.Distinct(); + ``` + +--- + +### 进阶操作示例 + +1. **分组统计**:按年龄分组学生并计算每组人数。 + ```cs + var result = students.GroupBy(x => x.Age) + .Select(g => new { Age = g.Key, Count = g.Count() }); + ``` + +2. **关联查询**:联结学生和课程,返回学生的所有课程。 + ```cs + var result = students.Join(courses, + s => s.Id, + c => c.StudentId, + (student, course) => new { student.Name, course.CourseName }); + ``` + +3. **翻转顺序**:将数组反转。 + ```cs + var result = numbers.Reverse(); + ``` + +4. **限制元素数量**:获取前 5 个数字。 + ```cs + var result = numbers.Take(5); + ``` + +5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。 + ```cs + var result = numbers.Skip(3); + ``` + +--- + +### 高级操作示例 + +1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。 + ```cs + var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}"); + ``` + +2. **生成序列**:创建包含从 1 到 10 的数组。 + ```cs + var result = Enumerable.Range(1, 10); + ``` + +3. **重复元素**:将一个元素重复多次,生成新数组。 + ```cs + var result = Enumerable.Repeat("元素", 10); + ``` + +4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。 + ```cs + var result = objects.OfType(); + ``` + + + + + diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" new file mode 100644 index 0000000..737ecde --- /dev/null +++ "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" @@ -0,0 +1,193 @@ +# 实现编辑功能 + +### 控制器中的实现 + +#### 1. 获取要编辑的记录 +通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。 +```csharp +public IActionResult Edit(int id) +{ + // 从数据库中查找目标记录 + var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); + + // 将记录传递给视图进行编辑 + return View(blog); +} +``` + +#### 2. 提交编辑后的数据 +通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。 +- 如果输入有效且记录存在,则更新数据并保存。 +- 如果未找到记录,则返回到列表页。 +```csharp +[HttpPost] +[ValidateAntiForgeryToken] +public IActionResult Edit(Blog input) +{ + var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id); + if (blog != null) + { + // 更新记录的字段 + blog.Title = input.Title; + blog.Content = input.Content; + blog.Author = input.Author; + } + + // 保存后跳转到首页 + return RedirectToAction("Index"); +} +``` + +--- + +### 视图中的实现 + +编辑界面使用表单提交修改内容,内容结构与新增页面类似: +```html +@model Blog.Models.Blog + +
+
+
+
+
+ +
+``` + +--- + +# 集成 LINQ 查询 + +LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。 + +### 查询单个元素 +- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。 +- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。 +```csharp +var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); +``` + +### 查询多个元素 +- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。 +```csharp +var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10); +``` + +### 返回指定字段 +- **映射结果**:使用 `Select()` 返回处理后的字段集合。 +```csharp +var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author }); +``` + +--- + +# 综合功能实现示例 + +## 删除功能 +### 删除视图 +```html +@model Blog.Models.Blog + + + + + + + + + + + + + + + + + + +
标题:@Model.Title
内容:@Model.Content
作者:@Model.Author
+ 确认删除 + + 取消 +
+``` + +### 控制器实现 +```csharp +public IActionResult ConfirmDelete(int id) +{ + var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); + if (blog != null) + { + Db.Blogs.Remove(blog); + } + return RedirectToAction("Index"); +} +``` + +--- + +## 新增功能 +### 新增视图 +```html +@model Blog.Models.Blog + +
+
+
+
+ +
+``` + +### 控制器实现 +```csharp +public IActionResult Create() +{ + return View(); +} + +[HttpPost] +public IActionResult Create(Blog input) +{ + if (ModelState.IsValid) + { + input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID + Db.Blogs.Add(input); + return RedirectToAction("Index"); + } + return View(input); +} +``` + +--- + +## 搜索功能 +### 搜索视图 +```html +
+
+ + +
+
+``` + +### 控制器实现 +```csharp +public IActionResult Index(string keyword) +{ + if (string.IsNullOrWhiteSpace(keyword)) + { + return View(Db.Blogs); + } + else + { + var results = Db.Blogs.Where(b => + b.Title.Contains(keyword) || + b.Content.Contains(keyword) || + b.Author.Contains(keyword)).ToList(); + return View(results); + } +} \ No newline at end of file -- Gitee From 3fe967615e57acb579813f5b1ec421fb2a0db0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com> Date: Sun, 8 Dec 2024 10:15:01 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF/20241202-(=E5=88=A0=E9=99=A4,?= =?UTF-8?q?=E6=9F=A5=E6=89=BE).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\231\244,\346\237\245\346\211\276).md" | 185 ------------------ 1 file changed, 185 deletions(-) delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" deleted file mode 100644 index 13031e0..0000000 --- "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" +++ /dev/null @@ -1,185 +0,0 @@ -## 删除操作 - -### 控制器中的处理逻辑 - -#### 1. 渲染删除页面 -- **操作**:根据传入的 `id` 在数据库表中查找对应记录。 -- **逻辑**: - - 如果找到记录,则返回元素供用户确认删除。 - - 如果找不到记录,则提示用户目标不存在。 -- **示例代码**: - ```cs - public IActionResult Delete(int id) - { - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - if (blog != null) - { - return View(blog); - } - return View(); - } - ``` - -#### 2. 执行删除操作 -- **操作**:再次通过 `id` 查找记录,找到后执行删除。 -- **示例代码**: - ```cs - public IActionResult DeleteOther(int id) - { - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - if (blog != null) - { - Db.Blogs.Remove(blog); - } - return RedirectToAction("Index"); - } - ``` - ---- - -### 视图中的实现 - -1. **展示要删除的记录**:页面显示记录的详细信息。 -2. **确认删除**:提供跳转链接,执行实际删除操作。 - ```html - 删除 - ``` -3. **取消操作**:返回首页。 - ```html - 取消删除 - ``` - ---- - -## 查找功能 - -### 视图层实现 - -1. **添加搜索框**:在主页视图中加入表单,连接到控制器的 `Index` 方法。 - ```html -
- - -
- ``` - -### 控制器逻辑 - -1. **处理搜索请求**: - - 判断是否有关键字输入。 - - 如果没有关键字,则显示所有内容。 - - 如果有关键字,则匹配相关数据并返回结果。 - ```cs - public IActionResult Index(string keyword) - { - if (string.IsNullOrEmpty(keyword)) - { - return View(Db.Blogs); - } - else - { - var list = Db.Blogs - .Where(x => x.Title.Contains(keyword) || x.Content.Contains(keyword) || x.Author.Contains(keyword)) - .ToList(); - return View(list); - } - } - ``` - ---- - -## LINQ 查询与 Lambda 表达式 - -### 基础操作示例 - -1. **查询特定元素**:获取数组中等于 5 的值。 - ```cs - var result = numbers.Where(x => x == 5); - ``` - -2. **筛选范围元素**:找出 2 到 8 之间的数字。 - ```cs - var result = numbers.Where(x => x > 2 && x < 8); - ``` - -3. **数据转换**:将数组中的每个数字乘以 2。 - ```cs - var result = numbers.Select(x => x * 2); - ``` - -4. **筛选特定属性**:获取名字以“王”开头的学生。 - ```cs - var result = students.Where(x => x.Name.StartsWith("王")); - ``` - -5. **排序**:找出年龄大于 20 的学生并按年龄降序排列。 - ```cs - var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age); - ``` - -6. **去重**:获取数组中所有不重复的数字。 - ```cs - var result = numbers.Distinct(); - ``` - ---- - -### 进阶操作示例 - -1. **分组统计**:按年龄分组学生并计算每组人数。 - ```cs - var result = students.GroupBy(x => x.Age) - .Select(g => new { Age = g.Key, Count = g.Count() }); - ``` - -2. **关联查询**:联结学生和课程,返回学生的所有课程。 - ```cs - var result = students.Join(courses, - s => s.Id, - c => c.StudentId, - (student, course) => new { student.Name, course.CourseName }); - ``` - -3. **翻转顺序**:将数组反转。 - ```cs - var result = numbers.Reverse(); - ``` - -4. **限制元素数量**:获取前 5 个数字。 - ```cs - var result = numbers.Take(5); - ``` - -5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。 - ```cs - var result = numbers.Skip(3); - ``` - ---- - -### 高级操作示例 - -1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。 - ```cs - var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}"); - ``` - -2. **生成序列**:创建包含从 1 到 10 的数组。 - ```cs - var result = Enumerable.Range(1, 10); - ``` - -3. **重复元素**:将一个元素重复多次,生成新数组。 - ```cs - var result = Enumerable.Repeat("元素", 10); - ``` - -4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。 - ```cs - var result = objects.OfType(); - ``` - - - - - -- Gitee From 3f1df96b81bd3aff20b48a79163c6e0fd9f82683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com> Date: Sun, 8 Dec 2024 10:15:08 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF/20241204-(=E7=BC=96=E8=BE=91,?= =?UTF-8?q?=E9=9B=86=E6=88=90=E6=9F=A5=E8=AF=A2).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\346\210\220\346\237\245\350\257\242).md" | 193 ------------------ 1 file changed, 193 deletions(-) delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" deleted file mode 100644 index 737ecde..0000000 --- "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" +++ /dev/null @@ -1,193 +0,0 @@ -# 实现编辑功能 - -### 控制器中的实现 - -#### 1. 获取要编辑的记录 -通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。 -```csharp -public IActionResult Edit(int id) -{ - // 从数据库中查找目标记录 - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - - // 将记录传递给视图进行编辑 - return View(blog); -} -``` - -#### 2. 提交编辑后的数据 -通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。 -- 如果输入有效且记录存在,则更新数据并保存。 -- 如果未找到记录,则返回到列表页。 -```csharp -[HttpPost] -[ValidateAntiForgeryToken] -public IActionResult Edit(Blog input) -{ - var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id); - if (blog != null) - { - // 更新记录的字段 - blog.Title = input.Title; - blog.Content = input.Content; - blog.Author = input.Author; - } - - // 保存后跳转到首页 - return RedirectToAction("Index"); -} -``` - ---- - -### 视图中的实现 - -编辑界面使用表单提交修改内容,内容结构与新增页面类似: -```html -@model Blog.Models.Blog - -
-
-
-
-
- -
-``` - ---- - -# 集成 LINQ 查询 - -LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。 - -### 查询单个元素 -- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。 -- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。 -```csharp -var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); -``` - -### 查询多个元素 -- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。 -```csharp -var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10); -``` - -### 返回指定字段 -- **映射结果**:使用 `Select()` 返回处理后的字段集合。 -```csharp -var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author }); -``` - ---- - -# 综合功能实现示例 - -## 删除功能 -### 删除视图 -```html -@model Blog.Models.Blog - - - - - - - - - - - - - - - - - - -
标题:@Model.Title
内容:@Model.Content
作者:@Model.Author
- 确认删除 - - 取消 -
-``` - -### 控制器实现 -```csharp -public IActionResult ConfirmDelete(int id) -{ - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - if (blog != null) - { - Db.Blogs.Remove(blog); - } - return RedirectToAction("Index"); -} -``` - ---- - -## 新增功能 -### 新增视图 -```html -@model Blog.Models.Blog - -
-
-
-
- -
-``` - -### 控制器实现 -```csharp -public IActionResult Create() -{ - return View(); -} - -[HttpPost] -public IActionResult Create(Blog input) -{ - if (ModelState.IsValid) - { - input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID - Db.Blogs.Add(input); - return RedirectToAction("Index"); - } - return View(input); -} -``` - ---- - -## 搜索功能 -### 搜索视图 -```html -
-
- - -
-
-``` - -### 控制器实现 -```csharp -public IActionResult Index(string keyword) -{ - if (string.IsNullOrWhiteSpace(keyword)) - { - return View(Db.Blogs); - } - else - { - var results = Db.Blogs.Where(b => - b.Title.Contains(keyword) || - b.Content.Contains(keyword) || - b.Author.Contains(keyword)).ToList(); - return View(results); - } -} \ No newline at end of file -- Gitee From 3e0251c036c20d686c3a364cab0024c331b88dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com> Date: Sun, 8 Dec 2024 19:04:18 +0800 Subject: [PATCH 4/4] =?UTF-8?q?12.04=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\346\210\220\346\237\245\350\257\242).md" | 192 +++++++++++++++++ ...\351\231\244,\346\237\245\346\211\276).md" | 192 ++++++++++++----- ...6\346\210\220\346\237\245\350\257\242).md" | 193 ------------------ 3 files changed, 336 insertions(+), 241 deletions(-) create mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" rename "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" => "\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" (47%) delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" new file mode 100644 index 0000000..3b066ed --- /dev/null +++ "b/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" @@ -0,0 +1,192 @@ +## 课堂笔记 + +### 控制器中的编辑操作 + +1. **显示编辑表单** (`Edit` 方法): + - 根据传入的 `id` 参数,使用 LINQ 查询从数据库中检索博客文章。 + - 如果找到对应的博客文章,将其传递给编辑视图。 + - 如果未找到,可以重定向到错误页面或列表页。 + + ```csharp + public IActionResult Edit(int id) + { + var blog = Db.Blog.FirstOrDefault(x => x.Id == id); + if (blog == null) + { + return NotFound(); // 或者 RedirectToAction("Index") 回到列表页 + } + return View(blog); + } + ``` + +2. **处理表单提交** (`Edit` 方法): + - 使用 `[HttpPost]` 和 `[ValidateAntiForgeryToken]` 属性来处理表单提交并防止跨站请求伪造。 + - 检索表单数据并更新数据库中的相应博客文章。 + - 保存更改并重定向到列表页或显示确认消息。 + + ```csharp + [HttpPost] + [ValidateAntiForgeryToken] + public IActionResult Edit(Blog input) + { + if (ModelState.IsValid) + { + Db.Blog.Update(input); + Db.SaveChanges(); + return RedirectToAction("Index"); // 重定向到列表页 + } + return View(input); + } + ``` + +### 视图中的编辑表单 + +- 编辑视图通常包含一个表单,允许用户修改博客文章的标题、内容和作者。 +- 使用 `Html.BeginForm` 方法创建表单,并设置 `asp-action` 属性为 "Edit"。 + +### LINQ 查询优化 + +1. **查询单个元素**: + - `FirstOrDefault` 方法用于安全地查询单个元素,如果没有找到匹配的元素,它将返回 `null` 而不是抛出异常。 + +2. **查询多个元素**: + - `Where` 方法用于查询符合特定条件的元素集合。 + +3. **选择和投影**: + - `Select` 方法用于选择查询结果的一部分或创建新的匿名对象。 + +### 空值和 null 的区别 + +- **null**: 在 C# 中,`null` 表示一个空引用,即没有指向任何对象。 +- **空值**: 对于值类型(如 `int`、`double` 等),空值表示没有值。对于引用类型,空值可以是 `null`。 + +## 课后作业 + +### 作业一 +```html +@model List; + + + +
+
+ 新增 +
+ + + + + + + + + + + + @foreach (var item in Model) + { + + + + + + + + } + +
序号标题内容作者操作
@item.Id@item.Title@item.Content@item.Author + 编辑 + 删除 +
+
+``` + +```cs +// 控制器中的 Index 动作方法,返回博客列表视图 +public IActionResult Index() +{ + return View(Db.Blogs); // 将数据库中的博客列表传递给视图 +} +``` +### 作业二 +```html +@model Apple.Models.Blogs; // 绑定视图模型为博客模型 + +
+
+
+
+ +
+``` + +```csharp +[HttpPost] +public IActionResult Create(Blogs input) +{ + var maxId = Db.Blogs.Select(t => t.Id).Max(); + input.Id = maxId + 1; + + Db.Blogs.Add(input); + Db.SaveChanges(); // 保存更改 + return RedirectToAction("Index"); // 重定向到博客列表页面 +} +``` + + +### 作业三 +要完成修改功能,你需要两个主要部分:视图(View)和控制器(Controller)动作方法。以下是如何实现编辑博客文章的修改功能的示例: + +### 视图(Edit.cshtml) + +```html +@model Apple.Models.Blogs + +
+ +
+
+
+ +
+``` + +在这个视图中,我们使用了 `asp-for` 标签帮助器来绑定模型的属性。注意 `Id` 字段是一个隐藏字段,这样当表单提交时,博客的 ID 也会被发送到服务器。 + +### 控制器(BlogController.cs) + +```csharp +public IActionResult Edit(int id) +{ + var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); + if (blog == null) + { + return NotFound(); // 如果找不到博客,返回 404 错误 + } + return View(blog); // 将博客模型传递给视图 +} + + +[HttpPost] +[ValidateAntiForgeryToken] +public IActionResult Edit(int id, Blogs input) +{ + if (id != input.Id) + { + return NotFound(); // 如果 ID 不匹配,返回 404 错误 + } + + if (ModelState.IsValid) + { + Db.Blogs.Update(input); // 更新数据库中的博客 + Db.SaveChanges(); // 保存更改 + return RedirectToAction("Index"); // 重定向到博客列表页面 + } + + return View(input); // 如果模型无效,重新显示编辑表单 +} +``` + + + + diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" similarity index 47% rename from "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" rename to "\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" index 13031e0..f2cd61e 100644 --- "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" +++ "b/\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" @@ -1,3 +1,4 @@ +## 课堂笔记 ## 删除操作 ### 控制器中的处理逻辑 @@ -87,10 +88,11 @@ ``` --- +## 课后作业 ## LINQ 查询与 Lambda 表达式 -### 基础操作示例 +### 基础练习 1. **查询特定元素**:获取数组中等于 5 的值。 ```cs @@ -116,68 +118,162 @@ ```cs var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age); ``` - -6. **去重**:获取数组中所有不重复的数字。 - ```cs - var result = numbers.Distinct(); - ``` +6. **查询并去重** +找出数组中所有不重复的数字。 +```cs +var distinctNumbers = numbers.Distinct(); +``` + +7. **查询第一个元素** +找出数组中第一个大于 3 的元素。 +```cs +var firstGreaterThanThree = numbers.First(x => x > 3); +``` +8. **查询最后一个元素** +找出数组中最后一个小于 7 的元素。 +```cs +var lastLessThanSeven = numbers.Last(x => x < 7); +``` + +9. **查询元素是否存在** +检查数组中是否存在大于 10 的元素。 +```cs +var existsGreaterThanTen = numbers.Any(x => x > 10); +``` + +10. **查询元素的计数** +计算数组中大于 5 的元素数量。 +```cs +var countGreaterThanFive = numbers.Count(x => x > 5); +``` + +11. **查询元素的总和** +计算数组中所有元素的总和。 +```cs +var sumOfNumbers = numbers.Sum(); +``` + +12. **查询元素的最大值** +找出数组中的最大值。 +```cs +var maxNumber = numbers.Max(); +``` + +13. **查询元素的最小值** +找出数组中的最小值。 +```cs +var minNumber = numbers.Min(); +``` + +14. **查询元素的平均值** +计算数组中所有元素的平均值。 +```cs +var average = numbers.Average(); +``` + +15. **查询特定条件的元素** +找出数组中能被 3 整除的元素。 +```cs +var divisibleByThree = numbers.Where(x => x % 3 == 0); +``` --- -### 进阶操作示例 - -1. **分组统计**:按年龄分组学生并计算每组人数。 - ```cs - var result = students.GroupBy(x => x.Age) - .Select(g => new { Age = g.Key, Count = g.Count() }); - ``` - -2. **关联查询**:联结学生和课程,返回学生的所有课程。 - ```cs - var result = students.Join(courses, - s => s.Id, - c => c.StudentId, - (student, course) => new { student.Name, course.CourseName }); - ``` - -3. **翻转顺序**:将数组反转。 - ```cs - var result = numbers.Reverse(); - ``` - -4. **限制元素数量**:获取前 5 个数字。 - ```cs - var result = numbers.Take(5); - ``` - -5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。 - ```cs - var result = numbers.Skip(3); - ``` - ---- - -### 高级操作示例 - -1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。 +### 中级练习 + +16. **查询并选择特定属性** +找出所有学生的姓名和年龄。 +```cs +var studentDetails = students.Select(s => new { s.Name, s.Age }); +``` + +17. **查询并分组** +按年龄分组学生,并计算每个年龄组的学生数量。 +```cs +var groupedByAge = students.GroupBy(s => s.Age) + .Select(group => new { Age = group.Key, Count = group.Count() }); +``` + +18. **查询并联结** +联结学生和课程表,找出每个学生的所有课程。 +```cs +var studentCourses = students.GroupJoin( + courses, + student => student.Id, + course => course.StudentId, + (student, studentCourses) => new + { + StudentName = student.Name, + Courses = studentCourses.Select(c => c.CourseName).ToList() + }); +``` + +19. **查询并反转** +反转数组中的元素顺序。 +```cs +var reversedNumbers = numbers.Reverse(); +``` + +20. **查询并填充** +找出数组中第一个大于 2 的元素,并用它填充后面的所有位置。 +```cs +var firstGreaterThanTwo = numbers.First(x => x > 2); +var filledNumbers = numbers.Select(x => firstGreaterThanTwo).ToArray(); +``` + +21. **查询并排除** +从数组中排除所有小于 5 的元素。 +```cs +var excludedNumbers = numbers.Where(x => x >= 5); +``` + +22. **查询并填充默认值** +如果数组中存在 null 值,用默认值 0 替换。 +```cs +var replacedNulls = nullableNumbers.Select(x => x ?? 0).ToArray(); +``` + +23. **查询并转换类型** +将字符串数组转换为整数数组。 +```cs +var intNumbers = stringNumbers.Select(int.Parse).ToArray(); +``` + +24. **查询并使用 OfType 过滤** +从对象数组中过滤出字符串类型的元素。 +```cs +var stringElements = objects.OfType().ToList(); +``` + + +### 高级练习 + +25. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。 ```cs var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}"); ``` -2. **生成序列**:创建包含从 1 到 10 的数组。 +26. **生成序列**:创建包含从 1 到 10 的数组。 ```cs var result = Enumerable.Range(1, 10); ``` -3. **重复元素**:将一个元素重复多次,生成新数组。 +27. **重复元素**:将一个元素重复多次,生成新数组。 ```cs var result = Enumerable.Repeat("元素", 10); ``` +28. **查询并使用 Take 限制数量** +从数组中取出前 5 个元素。 +```cs +var firstFive = numbers.Take(5); +``` + +29. **查询并使用 Skip 跳过元素** +跳过数组中的前 3 个元素,然后取出剩余的元素。 +```cs +var remainingElements = numbers.Skip(3); +``` -4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。 - ```cs - var result = objects.OfType(); - ``` diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" deleted file mode 100644 index 737ecde..0000000 --- "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" +++ /dev/null @@ -1,193 +0,0 @@ -# 实现编辑功能 - -### 控制器中的实现 - -#### 1. 获取要编辑的记录 -通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。 -```csharp -public IActionResult Edit(int id) -{ - // 从数据库中查找目标记录 - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - - // 将记录传递给视图进行编辑 - return View(blog); -} -``` - -#### 2. 提交编辑后的数据 -通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。 -- 如果输入有效且记录存在,则更新数据并保存。 -- 如果未找到记录,则返回到列表页。 -```csharp -[HttpPost] -[ValidateAntiForgeryToken] -public IActionResult Edit(Blog input) -{ - var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id); - if (blog != null) - { - // 更新记录的字段 - blog.Title = input.Title; - blog.Content = input.Content; - blog.Author = input.Author; - } - - // 保存后跳转到首页 - return RedirectToAction("Index"); -} -``` - ---- - -### 视图中的实现 - -编辑界面使用表单提交修改内容,内容结构与新增页面类似: -```html -@model Blog.Models.Blog - -
-
-
-
-
- -
-``` - ---- - -# 集成 LINQ 查询 - -LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。 - -### 查询单个元素 -- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。 -- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。 -```csharp -var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); -``` - -### 查询多个元素 -- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。 -```csharp -var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10); -``` - -### 返回指定字段 -- **映射结果**:使用 `Select()` 返回处理后的字段集合。 -```csharp -var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author }); -``` - ---- - -# 综合功能实现示例 - -## 删除功能 -### 删除视图 -```html -@model Blog.Models.Blog - - - - - - - - - - - - - - - - - - -
标题:@Model.Title
内容:@Model.Content
作者:@Model.Author
- 确认删除 - - 取消 -
-``` - -### 控制器实现 -```csharp -public IActionResult ConfirmDelete(int id) -{ - var blog = Db.Blogs.FirstOrDefault(b => b.Id == id); - if (blog != null) - { - Db.Blogs.Remove(blog); - } - return RedirectToAction("Index"); -} -``` - ---- - -## 新增功能 -### 新增视图 -```html -@model Blog.Models.Blog - -
-
-
-
- -
-``` - -### 控制器实现 -```csharp -public IActionResult Create() -{ - return View(); -} - -[HttpPost] -public IActionResult Create(Blog input) -{ - if (ModelState.IsValid) - { - input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID - Db.Blogs.Add(input); - return RedirectToAction("Index"); - } - return View(input); -} -``` - ---- - -## 搜索功能 -### 搜索视图 -```html -
-
- - -
-
-``` - -### 控制器实现 -```csharp -public IActionResult Index(string keyword) -{ - if (string.IsNullOrWhiteSpace(keyword)) - { - return View(Db.Blogs); - } - else - { - var results = Db.Blogs.Where(b => - b.Title.Contains(keyword) || - b.Content.Contains(keyword) || - b.Author.Contains(keyword)).ToList(); - return View(results); - } -} \ No newline at end of file -- Gitee