From 3eeed53de18583efaf5d0428eb04891756d979af Mon Sep 17 00:00:00 2001 From: queyongzhen <14089735+queyongzhen@user.noreply.gitee.com> Date: Sun, 1 Dec 2024 16:41:39 +0800 Subject: [PATCH] =?UTF-8?q?11.29=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...241120(Debian\351\203\250\347\275\262).md" | 128 ++++++++++ .../20241122(\344\274\240\345\217\202).md" | 80 +++++++ ...6\345\200\274\347\261\273\345\236\213).md" | 219 ++++++++++++++++++ ...6\345\210\260\350\247\206\345\233\276).md" | 176 ++++++++++++++ ...(\345\242\236\346\223\215\344\275\234).md" | 110 +++++++++ 5 files changed, 713 insertions(+) create mode 100644 "\351\230\231\346\263\263\347\217\215/20241125(\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213).md" create mode 100644 "\351\230\231\346\263\263\347\217\215/20241127(\346\270\262\346\237\223\346\225\260\346\215\256\345\210\260\350\247\206\345\233\276).md" create mode 100644 "\351\230\231\346\263\263\347\217\215/20241129(\345\242\236\346\223\215\344\275\234).md" diff --git "a/\351\230\231\346\263\263\347\217\215/20241120(Debian\351\203\250\347\275\262).md" "b/\351\230\231\346\263\263\347\217\215/20241120(Debian\351\203\250\347\275\262).md" index 728c778..489687d 100644 --- "a/\351\230\231\346\263\263\347\217\215/20241120(Debian\351\203\250\347\275\262).md" +++ "b/\351\230\231\346\263\263\347\217\215/20241120(Debian\351\203\250\347\275\262).md" @@ -40,4 +40,132 @@ server { proxy_pass http://localhost:5000; # 代理到本地5000端口 } } +``` + +# 作业 +## MVC练习 +### 1.创建一个控制台项目,没有任何选项,体会项目名称和什么有关系 +``` +dotnet new console -o MyConsoleApp +``` + +### 2.创建一个控制项目,项目名称Blog +``` +dotnet new console -n Blog +``` + +### 3.创建一个控制台项目,输出到Blog目录 +``` +dotnet new console -o Blog +``` + +### 4.创建一个MVC项目,指定项目名称 +``` +dotnet new mvc -n BlogMVC +``` + +### 5.创建一个MVC项目,指定输出目录 +``` +dotnet new mvc -n MyMvcProject -o MyMvcProjectOutput +``` + +### 6.创建一个带解决方案,其下有一个MVC项目,3个类库项目的“综合项目” +``` +dotnet new sln -n ComSolution +``` + +### 7.创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 +``` +public class HomeController : Controller +{ + public ActionResult Ok() + { + return View(); + } +} +.cshtml +

OK,Thanks!

+``` + +### 8.创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” +``` +public class BlogsController : Controller +{ + public ActionResult Index() + { + return View(); + } +} +.cshtml +

神级预判

+``` + +### 9.给第8题的新控制,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” +``` +public ActionResult Music() +{ + return View(); +} +.cshtml +

顶级打野

+``` + +### 10.给第8题的新控制器,新增一个Action,名为List,不接受任何参数,并返回对应视图,视图显示一个经典CRUD界面 +``` +public ActionResult List() +{ + return View(); +} +.cshtml + @{ + ViewData["Title"] = "Blog List"; + } + +

@ViewData["Title"]

+ +

这里是博客列表。您可以在这里执行CRUD操作。

+ + +
+ + + + +
+``` + +### 11.新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id +``` +public class ProductsController : Controller +{ + public ActionResult Edit(int id) + { + // 将id传递给视图 + ViewData["ProductId"] = id; + return View(); + } +} +``` + + +### 12.在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students(有姓名、年龄、体长属性)的参数,并展示该参数的姓名属性 +``` +.cs +namespace Blog.Models +{ + public class Student + { + public string Name { get; set; } + public int Age { get; set; } + public double Height { get; set; } + } +} + +public IActionResult Create(Student student) + { + // 展示学生的姓名属性 + ViewData["StudentName"] = student.Name; + return View(); + } + ``` \ No newline at end of file diff --git "a/\351\230\231\346\263\263\347\217\215/20241122(\344\274\240\345\217\202).md" "b/\351\230\231\346\263\263\347\217\215/20241122(\344\274\240\345\217\202).md" index 085c441..65c576b 100644 --- "a/\351\230\231\346\263\263\347\217\215/20241122(\344\274\240\345\217\202).md" +++ "b/\351\230\231\346\263\263\347\217\215/20241122(\344\274\240\345\217\202).md" @@ -81,3 +81,83 @@ public IActionResult Index(){ } ``` +# 课后作业(控制器传参) +## 1.简单参数传递 在一个叫Blog控制器中,定义一个叫Index的Action,并且传递一个int类型的值,id为变量名 +``` +public IActionResult Index(int id) +{ + return Content(id.ToString()); +} +``` + +## 2.简单参数传递 在一个叫Blog控制器中,定义一个叫Index_2的Action,并且传递一个string类型的值,id为变量名 +``` +public IActionResult Index_2(string id) +{ + return Content(id); +} +``` + +## 3.简单参数传递 在一个叫Blog控制器中,定义一个叫Index_3的Action,并且传递一个string类型的值,name为变量名 +``` +public IActionResult Index_3(string name) +{ + return Content(name); +} +``` + +## 4.复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create的Action,并且传递一个BlogCreateDto类型的值,blogCreateDto为变量名 +``` +[HttpPost] +public IActionResult Create([FromBody] BlogCreateDto blogCreateDto) +{ + return Content(JsonSerializer.Serialize(blogCreateDto)); +} + +新增类 +public class BlogCreateDto +{ + public string Title{get;set;} = null!; + public string Aothor{get;set;} = null!; + public string Content{get;set;} = null!; +} +``` + + + +## 5.复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_1的Action,并且传递一个Products类型的值,productCreateDto为变量名 +``` +[HttpPost] +public IActionResult Create_1([FromBody] Products productCreateDto) +{ + return Content(JsonSerializer.Serialize(productCreateDto)); +} + +新增类 +public class Products +{ + public string Name{get;set;} = null!; + public int Price{get;set;} = 0!; + public string Stock{get;set;} = null!; +} +``` + + +## 6.复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_2的Action,并且传递一个Students类型的值,studentCreateDto为变量名 +``` +[HttpPost] +public IActionResult Create_2([FromBody] Students studentCreateDto) +{ + return Content(JsonSerializer.Serialize(studentCreateDto)); +} + +新增类 +public class Students +{ + public string StudentName{get;set;} = null!; + public string Sex{get;set;} = null!; + public int Age{get;set;} = 0!; +} +``` + + diff --git "a/\351\230\231\346\263\263\347\217\215/20241125(\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213).md" "b/\351\230\231\346\263\263\347\217\215/20241125(\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213).md" new file mode 100644 index 0000000..dcdf352 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241125(\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213).md" @@ -0,0 +1,219 @@ +# HTTP请求 +## GET +- 用于请求从服务器检索特定资源。 + +## POST +- 用于向服务器提交数据进行处理请求(例如提交表单或上传文件)。 + +## PUT +- 用于向服务器发送数据以替换指定的资源。 + +## DELETE +- 用于请求服务器删除指定的资源。 + +# MVC模式中Action返回值类型 + +## 返回常见数据类型 +- `int` +- `string` +- `IList<>` + +## IActionResult (接口) +- 返回响应状态码: + - `200` (请求成功,响应正常) + - `301` (重定向) + - `401` + - `404` ('4开头的',资源找不到) + - `500` (服务器错误) 等 + + +## 视图 +- 用于返回HTML视图。 + +## 重定向 +- 用于将客户端重定向到另一个URL。 + +## ActionResult<> (类型) +- 可以同时返回状态码或常规数据类型。 + +## JsonResult, ContentResult +- 返回响应是纯粹的数据。 + +## PoCo +- 可以返回一个对象,这个对象在被返回时会被序列化(相对应的是,反序列化)为Json格式: + ```json + {"name":"xxx"} + + +### 信息 +* 序列化 --> 网络 --> 反序列化 + + +### 网络 +**网线** +* 用于连接网络设备的物理介质。 + + +### 光纤 +* 高速网络传输介质。 + + +### 网络设备 +* 包括路由器、交换机等,用于管理和转发网络数据。 + +# 课后作业(基础能力) +``` +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers +{ + public class BodyController : Controller + { + // 1. 生成一个随机整数,范围[0,100],包含0和100 + public IActionResult Random1() + { + Random random = new Random(); + int randomNumber = random.Next(0, 101); // 生成0到100之间的随机数 + ViewBag.RandomNumber = randomNumber; // 将随机数传递到视图 + return View(); + } + + // 2. 生成一个随机整数,范围(0,100),不包含0,包含100 + public IActionResult Random2() + { + Random random = new Random(); + int randomNumber = random.Next(1, 101); // 生成1到100之间的随机数 + ViewBag.RandomNumber = randomNumber; // 将随机数传递到视图 + return View(); + } + + // 3. 生成10个随机整数,范围[5,80] + public List Random3() + { + Random random = new Random(); + var list = new List(); + + for (int i = 0; i < 10; i++) + { + int randomNumber = random.Next(5, 81); // 生成5到80之间的随机数 + list.Add(randomNumber); // 将随机数加入列表 + } + + return list; + } + + // 4. 从100个中文字符中随机选择一个字符 + public IActionResult Random4() + { + string str = "阳光普照万物生机盎然人间烟火为理想哈奔波心怀激情燃烧血脉中流淌时间如梭不等人紧握双手勇往直前冲不畏艰难险阻勇攀高峰誓创未来新篇章书写人生真辉煌展现自我力量铸就传奇啊"; + Random random = new Random(); + int randomIndex = random.Next(0, str.Length); // 随机索引 + char randomChar = str[randomIndex]; // 获取随机字符 + return Content(randomChar.ToString()); // 返回字符内容 + } + + // 5. 从100个中文字符中随机选取5-50个字符组成一个新字符串 + public IActionResult Random5() + { + string str = "阳光普照万物生机盎然人间烟火为理想哈奔波心怀激情燃烧血脉中流淌时间如梭不等人紧握双手勇往直前冲不畏艰难险阻勇攀高峰誓创未来新篇章书写人生真辉煌展现自我力量铸就传奇啊"; + Random random = new Random(); + int length = random.Next(5, 51); // 随机生成5到50个字符 + string randomText = ""; + + for (int i = 0; i < length; i++) + { + int index = random.Next(str.Length); // 从字符串中随机选择一个字符 + randomText += str[index]; // 拼接字符 + } + + return Content(randomText); // 返回生成的字符串 + } + + // 6. 从姓氏和名字字符串中生成随机姓名 + public IActionResult Random6() + { + string surnames = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹孟高林何马陶冯程严唐"; + string names = "阳光普照万物生机盎然人间烟火为理想哈奔波心怀激情燃烧血脉中流淌时间如梭不等人紧握双手勇往直前冲不畏艰难险阻勇攀高峰誓创未来新篇章书写人生真辉煌展现自我力量铸就传奇啊"; + + Random random = new Random(); + char surname = surnames[random.Next(surnames.Length)]; // 随机选取姓氏 + int nameLength = random.Next(1, 3); // 随机选择名字的字数(1或2个字) + string firstName = ""; + + for (int i = 0; i < nameLength; i++) + { + firstName += names[random.Next(names.Length)]; // 拼接名字字符 + } + + string fullName = surname + firstName; // 拼接姓名 + return Content(fullName); // 返回生成的姓名 + } + + // 7. 随机生成100个 BlogCreateDto 类型的数据 + public IActionResult Random7() + { + string surnames = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹孟高林何马陶冯程严唐"; + string names = "阳光普照万物生机盎然人间烟火为理想哈奔波心怀激情燃烧血脉中流淌时间如梭不等人紧握双手勇往直前冲不畏艰难险阻勇攀高峰誓创未来新篇章书写人生真辉煌展现自我力量铸就传奇啊在这个快节奏的时代 时间仿佛成了一种奢侈 每个人都在忙碌中度过 追逐着心中的梦想和生活的琐碎 然而 在这无尽的奔波中 我们是否曾停下脚步 去感受那些被忽视的美好 一缕温暖的阳光 一声亲切的问候 一杯香浓的咖啡 都是生活赋予我们的礼物 让我们在忙碌之余 不忘珍惜这些微小而真实的瞬间 让心灵得到片刻的宁静与满足 因为 正是这些点点滴滴 汇聚成了我们丰富多彩的人生"; + + Random random = new Random(); + var blogList = new List(); + + for (int i = 0; i < 100; i++) + { + // 随机生成标题 + int titleLength = random.Next(6, 16); // 标题长度随机在6到15字之间 + string title = GenerateRandomString(names, titleLength); + + // 随机生成作者 + string author = GenerateRandomAuthor(surnames, names); + + // 随机生成内容 + int contentLength = random.Next(100, 201); // 内容字数随机在100到200字之间 + string content = GenerateRandomString(names, contentLength); + + var blog = new BlogCreateDto + { + Title = title, + Author = author, + Content = content + }; + + blogList.Add(blog); // 将生成的博客对象加入列表 + } + + return View(blogList); // 返回包含100个博客的视图 + } + + // 辅助方法:生成指定长度的随机字符串 + private string GenerateRandomString(string source, int length) + { + Random random = new Random(); + string result = ""; + + for (int i = 0; i < length; i++) + { + result += source[random.Next(source.Length)]; + } + + return result; + } + + // 辅助方法:生成随机作者 + private string GenerateRandomAuthor(string surnames, string names) + { + Random random = new Random(); + char surname = surnames[random.Next(surnames.Length)]; + int nameLength = random.Next(1, 3); // 名字长度为1或2 + string firstName = GenerateRandomString(names, nameLength); + return surname + firstName; + } + } + + // BlogCreateDto 数据传输对象 + public class BlogCreateDto + { + public string Title { get; set; } = null!; + public string Author { get; set; } = null!; + public string Content { get; set; } = null!; + } +} +``` diff --git "a/\351\230\231\346\263\263\347\217\215/20241127(\346\270\262\346\237\223\346\225\260\346\215\256\345\210\260\350\247\206\345\233\276).md" "b/\351\230\231\346\263\263\347\217\215/20241127(\346\270\262\346\237\223\346\225\260\346\215\256\345\210\260\350\247\206\345\233\276).md" new file mode 100644 index 0000000..e019f65 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241127(\346\270\262\346\237\223\346\225\260\346\215\256\345\210\260\350\247\206\345\233\276).md" @@ -0,0 +1,176 @@ +## 页面内容展示 +* **基础数据展示** :在视图中直接渲染基础数据。 +* **复杂数据展示** :视图中展示包含多个属性的对象数据。 +* **列表数据展示** :视图中渲染集合或列表形式的数据。 + + +## Razor 语法 +>Razor 允许开发者在 HTML 中嵌入 C# 代码,使用 `@` 符号实现 HTML 与 C# 的无缝切换。`@` 符号后跟特定关键字时,会触发 Razor 的特殊指令。 + + +### 隐式表达式 +>以 `@` 开头,紧接着 C# 代码,不允许有空格(`await` 关键词除外),并且不能包含 C# 泛型,因为尖括号 `<>` 会被误认为是 HTML 标签。 + + +### 显式表达式 +>通过 `@` 符号加上成对的圆括号来定义。 + + +### Razor 代码段 +* 以 `@` 开始,用 `{}` 包围的代码块,例如: + +```cshtml +@{ + var message = "Hello, Razor!"; +} +

@message

+@{ + message = "Welcome to Razor world!"; +} +

@message

+``` + + +## ASP.NET Core 内置标记助手 - 链接生成 +>ASP.NET Core 提供的标记助手可以扩展标准的 HTML `` 标签,通过添加前缀为 `asp-` 的属性来实现 URL 的动态生成。 + + +**属性说明:** +1. `asp-controller`:指定用于 URL 生成的控制器。 +2. `asp-action`:指定控制器中的动作名称,用于生成 href 属性。 +3. `asp-all-route-data`:允许以键值对形式传递路由参数,其中键为参数名,值为参数值。 + + +# 课后作业(视图及其模板引擎) +## 1.渲染(展示)简单数据类型到视图 +``` +public string Index() +{ + return "我是简单数据类型"; +} +``` + +## 2.渲染(展示)对象数据到视图 +``` +public IActionResult Index_2() +{ + var list = new BlogCreateDto + { + Title="今天星期三", + Author="张三", + Content="明天星期四,明天没有课,可以睡一天" + }; + + return View(list); +} +``` + + +## 3.渲染(展示)集合数据到视图 +``` +public IActionResult Index_3() +{ + var list = new List + { + new BlogCreateDto + { + Title="今天星期三", + Author="张三", + Content="明天星期四,明天没有课,可以睡一天", + }, + new BlogCreateDto + { + Title="明天星期四", + Author="张三", + Content="今天星期四,没有课,好爽", + }, + new BlogCreateDto + { + Title="后天星期五", + Author="张三", + Content="今天上午上完课就可以放假,开心", + }, + }; + return View(list); +} +``` +``` + + + + + + + + @foreach(var item in @Model) + { + + + + + + + } +
标题作者内容操作
@item.Title@item.Author@item.Content + + +
+``` + + + +## 4.渲染(展示)包含集合数据的对象数据到视图 +``` +public IActionResult Index_4() +{ + var blog = new Blog + { + Title = "今天周四", + Author = "张三", + Content = "今天怎么这么快就过完了,啊啊啊啊啊,不想上早八", + BlogCreateDto = new List + { + new BlogCreateDto + { + Title="明天天星期五", + Author = "张三", + Content = "上午上完课就可以放假,开心" + }, + new BlogCreateDto + { + Title="明天星期五", + Author = "张三", + Content = "上午上完课就可以放假,开心" + }, + } + }; + return View(blog); +} +``` +``` +

@Model.Title

+

@Model.Author

+

@Model.Content

+ +

BlogCreateDto:

+ + + + + + + + @foreach(var item in @Model.BlogCreateDto) + { + + + + + + + } +
标题作者内容操作
@item.Title@item.Author@item.Content + + +
+``` diff --git "a/\351\230\231\346\263\263\347\217\215/20241129(\345\242\236\346\223\215\344\275\234).md" "b/\351\230\231\346\263\263\347\217\215/20241129(\345\242\236\346\223\215\344\275\234).md" new file mode 100644 index 0000000..c8dfaed --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241129(\345\242\236\346\223\215\344\275\234).md" @@ -0,0 +1,110 @@ +### 定义模型并模拟数据库 + +我们首先定义一个模拟的数据库,使用静态类来模拟数据表。这个数据库将包含一个 `Blog` 类列表,该列表用于存储博客文章。 + +#### 创建数据库模型 + +``` +public static class Db +{ + public static List Blog { get; set; } + + // 静态构造函数,确保初始化只执行一次 + static Db() + { + Blog = new List(); + + for (int i = 0; i < 15; i++) + { + var tmp = new Blog + { + Id = i + 1, + Title = "Title " + (i + 1), + Content = "Content of blog post " + (i + 1), + Author = "Author " + (i + 1) + }; + Blog.Add(tmp); + } + } +} +``` + +* **静态构造函数** :`Db` 类的静态构造函数会在第一次访问类时执行,并初始化 `Blog` 集合。 +* **延迟初始化** :这确保了 `Blog` 集合只有在需要时才被初始化。 +* **数据填充** :通过静态构造函数,模拟的数据库会自动填充 15 条数据。 + +--- + +### 2. 创建视图来展示内容 + +#### 展示博客列表并提供增、删、改功能 + +使用 `
` 标签和 Razor 的 `asp-` 属性来生成控制器操作的链接。以新增博客为例: + +``` +新增 +``` + +* `asp-controller`:指定表单提交的目标控制器。 +* `asp-action`:指定表单提交时调用控制器中的动作方法。 + +#### 编辑链接示例 + +``` +编辑 +``` + +* `asp-route-id`:传递给控制器的路由参数,通常是编辑项的 ID。 + +--- + +### 3. 跳转至增加页面并创建表单 + +#### 创建新增博客的表单 + +在 `Create` 动作对应的视图中,使用 `form` 表单来提交数据: + +``` +@model Blogs.Models.Blog + +
+
+
+
+ +
+``` + +* `@model` 声明:指定当前视图使用的模型类型。 +* `asp-for`:为表单控件指定与模型属性的绑定。 +* `asp-action="Create"`:表单提交后将调用 `Create` 动作方法。 + +--- + +### 4. 使用 POST 请求添加数据 + +#### 处理新增请求 + +在控制器的 `Create` 动作中,我们将接收表单数据并将其添加到模拟数据库中。 + +``` +[HttpPost] +public IActionResult Create(Blog input) +{ + // 获取表单中最大 ID 数,确保新添加的博客有唯一 ID + var maxId = Db.Blog.Select(t => t.Id).Max(); + input.Id = maxId + 1; // 设置新的 ID + + // 将新增的博客添加到数据库 + Db.Blog.Add(input); + + // 重定向到博客列表页面 + return RedirectToAction("Index"); + // 测试:return Content(JsonSerializer.Serialize(input)); 可返回提交的内容 +} +``` + +* **获取最大 ID** :使用 `Max()` 方法来找到当前 `Blog` 集合中的最大 ID,以便新博客的 ID 能自动递增。 +* **重定向** :数据添加后,页面会重定向回博客列表页 (`Index`),确保用户可以看到最新的博客列表。 + + -- Gitee