diff --git "a/\351\230\231\346\263\263\347\217\215/20241202(\345\210\240\351\231\244&\346\237\245\350\257\242\346\223\215\344\275\234).md" "b/\351\230\231\346\263\263\347\217\215/20241202(\345\210\240\351\231\244&\346\237\245\350\257\242\346\223\215\344\275\234).md" new file mode 100644 index 0000000000000000000000000000000000000000..cb920959331c2ee406a1923afc2361aadf7b35e3 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241202(\345\210\240\351\231\244&\346\237\245\350\257\242\346\223\215\344\275\234).md" @@ -0,0 +1,210 @@ +## 删除操作 +### 控制器中的处理逻辑 +#### 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); + } + } + ``` + +## 课后作业 + +### 作业一 +```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\230\231\346\263\263\347\217\215/20241204(\347\274\226\350\276\221&\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\230\231\346\263\263\347\217\215/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 0000000000000000000000000000000000000000..f11f1ee5c50a48ab9eeea780cff1088c2d0b4873 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241204(\347\274\226\350\276\221&\351\233\206\346\210\220\346\237\245\350\257\242).md" @@ -0,0 +1,389 @@ +# 实现编辑功能 +### 控制器中的实现 +#### 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); + } +} + + +# 课后作业 +## 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(); +``` + +7. **查询第一个元素**: 找出数组中第一个大于3的元素。 +```cs + public IActionResult Index7(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result7=numbers.FirstOrDefault(x=>x>3).ToString(); + return Ok(result7); + } +``` + +8. **查询最后一个元素**: 找出数组中最后一个小于7的元素。 +```cs + public IActionResult Index8(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3}; + var result8=numbers.LastOrDefault(x=>x<7).ToString(); + return Ok(result8); + } +``` + +9. **查询元素是否存在** 检查数组中是否存在大于10的元素。 +```cs + public IActionResult Index9(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + bool result9=numbers.Any(x=>x>10); + return Ok(result9); + } +``` + +10. **查询元素的计数** 计算数组中大于5的元素数量。 +```cs + public IActionResult Index10(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result10=numbers.Count(x=>x>5).ToString(); + return Ok(result10); + } +``` + +11. **查询元素的总和** 计算数组中所有元素的总和。 +```cs + public IActionResult Index11(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result11=numbers.Sum(); + return Ok(result11); + } +``` + +12. **查询元素的最大值** 找出数组中的最大值。 +```cs + public IActionResult Index12(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result12=numbers.Max().ToString(); + return Ok(result12); + } +``` + +13. **查询元素的最小值** 找出数组中的最小值。 +```cs + public IActionResult Index13(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result13=numbers.Min().ToString(); + return Ok(result13); + } +``` + +14. **查询元素的平均值** 计算数组中所有元素的平均值。 +```cs + public IActionResult Index14(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result14=numbers.Average().ToString(); + return Ok(result14); + } +``` + +15. **查询特定条件的元素** 找出数组中能被3整除的元素。 +```cs + public IActionResult Index15(){ + int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 }; + var result15=numbers.Where(x=>x%3==0).ToList(); + return Ok(result15); + } +``` + + + +### 中阶操作示例 +16. **分组统计**:按年龄分组学生并计算每组人数。 +```cs +var result = students.GroupBy(x => x.Age) + .Select(g => new { Age = g.Key, Count = g.Count() }); +``` + +17. **关联查询**:联结学生和课程,返回学生的所有课程。 +```cs +var result = students.Join(courses, + s => s.Id, + c => c.StudentId, + (student, course) => new { student.Name, course.CourseName }); +``` + +18. **翻转顺序**:将数组反转。 +```cs +var result = numbers.Reverse(); +``` + +19. **限制元素数量**:获取前 5 个数字。 +```cs +var result = numbers.Take(5); +``` + +20. **跳过元素**:跳过前 3 个数字,获取剩余的内容。 +```cs +var result = numbers.Skip(3); +``` + +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}"); +``` + +26. **生成序列**:创建包含从 1 到 10 的数组。 +```cs + var result = Enumerable.Range(1, 10); +``` + +27. **重复元素**:将一个元素重复多次,生成新数组。 +```cs + var result = Enumerable.Repeat("元素", 10); +``` + +28. **过滤特定类型**:从对象数组中过滤出字符串类型的值。 +```cs + var result = objects.OfType(); +``` + +29. **查询并使用 Skip 跳过元素** :跳过数组中的前 3 个元素,然后取出剩余的元素。 +```cs + var remainingElements = numbers.Skip(3); +```