diff --git "a/\347\250\213\346\242\246/20241122_Linux\347\273\203\344\271\240&MVC\347\273\203\344\271\240&\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202\347\273\203\344\271\240.md" "b/\347\250\213\346\242\246/20241122_Linux\347\273\203\344\271\240&MVC\347\273\203\344\271\240&\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202\347\273\203\344\271\240.md" deleted file mode 100644 index aa172b3b0c63ad985b5ab70d2fa724c7e3507e0b..0000000000000000000000000000000000000000 --- "a/\347\250\213\346\242\246/20241122_Linux\347\273\203\344\271\240&MVC\347\273\203\344\271\240&\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202\347\273\203\344\271\240.md" +++ /dev/null @@ -1,314 +0,0 @@ -# Linux练习 -> 任务1:尝试使用以下几种方式分别登录服务器,说明它们分别的注意事项,并说明它们之间的区别 -`ssh客户端`:(操作简单,cmd终端就可以) -* 确保服务器的ssh服务已开启;ssh端口号(默认22);配置以使用密钥认证 -* 基础的ssh连接工具;自带工具;足够用于日常远程登录和管理 -* 适用于所有操作系统 -`tabby应用`:(有点复杂,需要用ssh配置连接) -* 是一个开源的终端平台;支持ssh,telnet,串口连接等;安装tabby应用;配置连接时,需输入正确的服务器信息(主机名、端口、用户名等);可以创建多个配置文件以保存不同的服务器连接信息 -* 提供图形界面;适合管理多个连接的用户;集成了多个终端和连接工具,方便管理多个服务器 -`xShell`:(复杂,根据IP公网登录了,连接网页需用xftp连接显示网页) -* 是一个Windows平台的ssh客户端;支持ssh密钥认证和会话保存 -* 专为Windows设计,提供图形界面 -`putty`:(也很简单,需安装putty包操作) -* 是一个轻量级工具;启动速度快;不提供像tabby和xshell那样的多标签或多会话管理功能 -* 适合快速的ssh连接 - -> 任务2:更新软件源,命令:apt update,并了解这一步的实际用处和意义 -`apt update`: -* 实际用处:apt update 命令会同步本地软件包列表与软件源服务器上的列表,确保系统是最新的软件包版本 -* 意义:最新的软件包可以确保系统的安全性和稳定性;过时的版本会导致安全问题或兼容性问题 -* 既不移除已安装的软件包也不安装新软件包,只升级已存在的软件包 -* `apt update`只是更新了本地的软件包索引;`apt upgrade或apt install`执行实际的软件包下载和安装 -> 任务3:更新软件和补丁,命令:apt upgrade -y,并了解这一步的实际用处意义 -`apt upgrade -y`: -* 实际用处:安全补丁,确保系统免受已知漏洞的影响,维护系统的稳定性和性能 -* 意义:对bug修复,自动更新,系统上所有可升级的软件包都将被更新到最新版本 -* 需安装新软件包,可使用该命令 -> 任务4.Linux命令略微熟练 -> 任务5.在服务器上安装SDK环境 -`安装SDK环境步骤`: -* 先登录服务器-->进入dotnet官网-->点击下载.net8.0-->选择Linux的包管理器安装程序-->选择Debian系统(Debian12)-->打开cmd终端输入命令`wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb`(先下载文件)-->`dpkg -i packages-microsoft-prod.deb`(注册文件)-->`rm packages-microsoft-prod.deb`(删除已注册的文件)-->`apt update`(更新软件源)-->`apt install dotnet-sdk-8.0`(安装命令)-->`dotnet`(检测已安装情况) -> 任务6.使用nginx部署10个静态网站,要求不同域名,不同内容 -主要步骤: -安装nginx -上传网页 -配置nginx配置文件 -测试nginx配置文件,命令:nginx -t -强制让nginx加载配置文件,命令:nginx -s reload -* 部署静态网站的步骤: - 1. 先登录服务器-->安装SDK运行环境(步骤看任务5) - 2. 部署MVC终端命令`dotnet new mvc -0 ./Blog/` -# MVC练习 -> 1. 创建一个控制台项目,没有任何选项,体会项目名称和什么有关系 -* 项目文件夹:在文件系统中,项目名称成为存放项目文件的文件夹名称 -* 命名空间:在C#中,项目名称默认成为代码文件中的根命名空间 -* Assembly名称:编译后的DLL或EXE文件的名称,默认与项目名称相同 -* 解决方案资源管理器:在Visual Studio中,项目名称显示在解决方案资源管理器中,代表你的项目 -* 例如,如果你将项目命名为“MyConsoleApp”,那么 - ```js - 1. 文件夹名称可能是“MyConsoleApp” - 2. 命名空间可能是“MyConsoleApp” - 3. 输出的DLL或EXE文件名可能是“MyConsoleApp.dll”或“MyConsoleApp.exe” - ``` -> 2. 创建一个控制项目,项目名称Blog -`dotnet new console -n Blog` -> 3. 创建一个控制台项目,输出到Blog目录 -`cd Blog` -> 4. 创建一个MVC项目,指定项目名称 -`dotnet new mvc -n Blog` -> 5. 创建一个MVC项目,指定输出目录 -`dotnet new mvc -0 ./Blog/` -> 6. 创建一个带解决方案,其下有一个MVC项目,3个类库项目的“综合项目” -`dotnet new sln`(创建解决方案)-->`mkdir src`(创建文件夹)--> `dotnet new classlib -0 ./src/Blog.Core`(创建类库)-->`dotnet sln add .\src\Blog.Core\`(将类库添加到解决方案中)-->`dotnet build`(编译项目) -> 7. 创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 -`dotnet new mvc`-->在Home下建一个文件ok.cshtml --->在ok.cshtml里 -```js -昨天今天每天 -陪你左右 -``` --->在控制器中HomeController.cs里 -```js - public IActionResult ok() - { - return View(); - } -``` --->`dotnet watch`热重载-->html网页地址`http://localhost:5000/Home/ok` -> 8. 创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” -`dotnet new mvc` --->在Controllers里键一个文件Blogs.cs -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class Blogs:Controller{ - public IActionResult Index() - { - return View(); - } -} -``` ---->在Views里建一个文件夹Blogs-->在建一个文件index.cshtml -```js -神级预判 -//html网页地址http://localhost:5000/Blogs/index -``` -> 9. 给第8题的新控制,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” --->在Controllers里的一个文件Blogs.cs里 -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class Blogs:Controller{ - public IActionResult Index() - { - return View(); - } - public IActionResult Music() - { - return View(); - } -} -``` ---->在Views里建一个文件夹Blogs-->在建一个文件Music.cshtml -```js -顶级打野 -//html网页地址http://localhost:5000/Blogs/Music -``` -> 10. 给第8题的新控制器,新增一个Action,名为List,不接受任何参数,并返回对应视图,视图显示一个经典CRUD界面 - -> 11. 新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id -```js - public IActionResult Edit( int id){ - return Content(id.ToString()); - } -``` -> 12. 在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students(有姓名、年龄、体长属性)的参数,并展示该参数的姓名属性 -## [显示效果] -![MVC练习12](./MVC练习显示效果/MVC练习-12.PNG) -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class BabyController:Controller{ - public Students Create(int id) - { - var students=new Students - { - Name="小白", - Age="20", - Height = "185" - }; - return students; - } - [HttpPost] - public IActionResult Create([FromBody] Students students){ - return View(students); - } -} - - public class Students -{ - public string Name { get;set;}=null!; - public string Age { get;set;}=null!; - public string Height { get;set;}=null!; -} -``` -# 控制器传参练习 -> 1. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index的Action,并且传递一个int类型的值,id为变量名 -```js - public IActionResult Index( int id){ - return Content(id.ToString()); - } -//html页面中在网址上输入数字(http://localhost:5000/baby/index/12345)会在页面上显示12345 -``` -> 2. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_2的Action,并且传递一个string类型的值,id为变量名 -```js - public IActionResult Index_2( string id){ - return Content(id.ToString()); - } -//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 -``` -> 3. 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_3的Action,并且传递一个string类型的值,name为变量名 -**注意:**变量名改了得在Program.cs里的` pattern: "{controller=Home}/{action=Index}/{name?}");`修改 -```js - public IActionResult Index_3( string name){ - return Content(id.ToString()); - } -//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 -``` -> 4. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create的Action,并且传递一个BlogCreateDto类型的值,blogCreateDto为变量名; -PS: BlogCreateDto类型具有Title、Author、Content自动属性 -## [显示效果] -![控制器传参任务4](./MVC练习显示效果/控制器传参-4.PNG) -**在控制器中输入** -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class BabyController:Controller{ -//视图显示 - [HttpPost] - public IActionResult Create([FromBody] BlogCreateDto blogCreateDto){ - return View(blogCreateDto); - } - public IActionResult Index( int id){ - var blogCreateDto=new BlogCreateDto{ - Author="小红", - Title="果敢", - Content="人生不就是白干加白干" - }; - return View(blogCreateDto); - } -} -// 定义类型 - public class BlogCreateDto{ - public string Title{get;set;}=null!; - public string Author{get;set;}=null!; - public string Content{get;set;}=null!; - } -``` -**在views里的Baby的Index.cshtml中** -```js -@model Blog.Controllers.BlogCreateDto; - -

@Model.Title

-@Model.Author -@Model.Content -``` -> 5. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_1的Action,并且传递一个Products类型的值,productCreateDto为变量名 -PS: Products类型具有Name、Price、Stock自动属性 -## [显示效果] -![控制器传参任务4](./MVC练习显示效果/控制器传参-5.PNG) -**在控制器中输入** -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class BabyController:Controller{ -//视图显示 - [HttpPost] - public IActionResult Create_1([FromBody] Products productCreateDto){ - return View(productCreateDto); - } - public IActionResult Index( int id){ - var productCreateDto=new Products{ - Name="橡皮擦", - Price="2¥", - Stock="200个" - }; - return View(productCreateDto); - } -} -// 定义类型 - public class Products{ - public string Name{get;set;}=null!; - public string Price{get;set;}=null!; - public string Stock{get;set;}=null!; - } -``` -**在views里的Baby的Index.cshtml中** -```js -@model Blog.Controllers.Products; - -

商品:@Model.Name

-价格:@Model.Price -库存:@Model.Stock -``` -> 6. 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_2的Action,并且传递一个Students类型的值,studentCreateDto为变量名 -PS: Students类型具有StudentName、Sex、Age自动属性 -## [显示效果] -![控制器传参任务4](./MVC练习显示效果/控制器传参-6.PNG) -**在控制器中输入** -```js -using Microsoft.AspNetCore.Mvc; -namespace Blog.Controllers; -public class BabyController:Controller{ -//视图显示 - [HttpPost] - public IActionResult Create_2([FromBody] Students studentCreateDto){ - return View(studentCreateDto); - } - public IActionResult Index( int id){ - var studentCreateDto=new Students{ - StudentName="蓝蓝", - Sex="女", - Age="18" - }; - return View(studentCreateDto); - } -} -// 定义类型 - public class Students{ - public string StudentName{get;set;}=null!; - public string Sex{get;set;}=null!; - public string Age{get;set;}=null!; - } -``` -**在views里的Baby的Index.cshtml中** -```js -@model Blog.Controllers.Students; - -

姓名:@Model.StudentName

-性别:@Model.Sex -年龄:@Model.Age -``` \ No newline at end of file diff --git "a/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" "b/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" index 06a8ec282ce84bd99f885850d431e2d0fa82400f..59d0c78b728891d2ebadb740ebb709d9f4384610 100644 --- "a/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" +++ "b/\347\250\213\346\242\246/20241122_\346\216\247\345\210\266\345\231\250\344\274\240\345\217\202&\350\247\206\345\233\276\346\230\276\347\244\272.md" @@ -78,4 +78,334 @@ public IActionResult Create ([FromBody] BlogCreateDto blogCreateDto) @Model.Content ``` +# Linux练习 +## 任务1: +> 尝试使用以下几种方式分别登录服务器,说明它们分别的注意事项,并说明它们之间的区别 +`ssh客户端`:(操作简单,cmd终端就可以) +* 确保服务器的ssh服务已开启;ssh端口号(默认22);配置以使用密钥认证 +* 基础的ssh连接工具;自带工具;足够用于日常远程登录和管理 +* 适用于所有操作系统 +`tabby应用`:(有点复杂,需要用ssh配置连接) +* 是一个开源的终端平台;支持ssh,telnet,串口连接等;安装tabby应用;配置连接时,需输入正确的服务器信息(主机名、端口、用户名等);可以创建多个配置文件以保存不同的服务器连接信息 +* 提供图形界面;适合管理多个连接的用户;集成了多个终端和连接工具,方便管理多个服务器 +`xShell`:(复杂,根据IP公网登录了,连接网页需用xftp连接显示网页) +* 是一个Windows平台的ssh客户端;支持ssh密钥认证和会话保存 +* 专为Windows设计,提供图形界面 +`putty`:(也很简单,需安装putty包操作) +* 是一个轻量级工具;启动速度快;不提供像tabby和xshell那样的多标签或多会话管理功能 +* 适合快速的ssh连接 + +## 任务2: +> 更新软件源,命令:apt update,并了解这一步的实际用处和意义 +`apt update`: +* 实际用处:apt update 命令会同步本地软件包列表与软件源服务器上的列表,确保系统是最新的软件包版本 +* 意义:最新的软件包可以确保系统的安全性和稳定性;过时的版本会导致安全问题或兼容性问题 +* 既不移除已安装的软件包也不安装新软件包,只升级已存在的软件包 +* `apt update`只是更新了本地的软件包索引;`apt upgrade或apt install`执行实际的软件包下载和安装 +## 任务3: +> 更新软件和补丁,命令:apt upgrade -y,并了解这一步的实际用处意义 +`apt upgrade -y`: +* 实际用处:安全补丁,确保系统免受已知漏洞的影响,维护系统的稳定性和性能 +* 意义:对bug修复,自动更新,系统上所有可升级的软件包都将被更新到最新版本 +* 需安装新软件包,可使用该命令 +## 任务5: +> 在服务器上安装SDK环境 +`安装SDK环境步骤`: +* 先登录服务器-->进入dotnet官网-->点击下载.net8.0-->选择Linux的包管理器安装程序-->选择Debian系统(Debian12)-->打开cmd终端输入命令`wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb`(先下载文件)-->`dpkg -i packages-microsoft-prod.deb`(注册文件)-->`rm packages-microsoft-prod.deb`(删除已注册的文件)-->`apt update`(更新软件源)-->`apt install dotnet-sdk-8.0`(安装命令)-->`dotnet`(检测已安装情况) +## 任务6: +> 使用nginx部署10个静态网站,要求不同域名,不同内容 +主要步骤: +安装nginx +上传网页 +配置nginx配置文件 +测试nginx配置文件,命令:nginx -t +强制让nginx加载配置文件,命令:nginx -s reload +* 部署静态网站的步骤: + 1. 先登录服务器-->安装SDK运行环境(步骤看任务5) + 2. 部署MVC终端命令`dotnet new mvc -0 ./Blog/` +# MVC练习 +## 1. +> 创建一个控制台项目,没有任何选项,体会项目名称和什么有关系 +* 项目文件夹:在文件系统中,项目名称成为存放项目文件的文件夹名称 +* 命名空间:在C#中,项目名称默认成为代码文件中的根命名空间 +* Assembly名称:编译后的DLL或EXE文件的名称,默认与项目名称相同 +* 解决方案资源管理器:在Visual Studio中,项目名称显示在解决方案资源管理器中,代表你的项目 +* 例如,如果你将项目命名为“MyConsoleApp”,那么 + ```js + 1. 文件夹名称可能是“MyConsoleApp” + 2. 命名空间可能是“MyConsoleApp” + 3. 输出的DLL或EXE文件名可能是“MyConsoleApp.dll”或“MyConsoleApp.exe” + ``` +## 2. +> 创建一个控制项目,项目名称Blog +`dotnet new console -n Blog` +## 3. +> 创建一个控制台项目,输出到Blog目录 +`cd Blog` +## 4. +> 创建一个MVC项目,指定项目名称 +`dotnet new mvc -n Blog` +## 5. +> 创建一个MVC项目,指定输出目录 +`dotnet new mvc -0 ./Blog/` +## 6. +> 创建一个带解决方案,其下有一个MVC项目,3个类库项目的“综合项目” +`dotnet new sln`(创建解决方案)-->`mkdir src`(创建文件夹)--> `dotnet new classlib -0 ./src/Blog.Core`(创建类库)-->`dotnet sln add .\src\Blog.Core\`(将类库添加到解决方案中)-->`dotnet build`(编译项目) +## 7. +> 创建一个项目,在默认控制器(Home)下,新增一个Action方法,名为Ok,同时为其创建对应视图以显示这个视图 +`dotnet new mvc`-->在Home下建一个文件ok.cshtml +-->在ok.cshtml里 +```js +昨天今天每天 +陪你左右 +``` +-->在控制器中HomeController.cs里 +```js + public IActionResult ok() + { + return View(); + } +``` +-->`dotnet watch`热重载-->html网页地址`http://localhost:5000/Home/ok` +## 8. +> 创建一个项目,创建一个新的控制器,名为Blogs,新的控制器拥有一个名为Index的Action,该方法返回一个视图,视图显示“神级预判” +`dotnet new mvc` +-->在Controllers里键一个文件Blogs.cs +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class Blogs:Controller{ + public IActionResult Index() + { + return View(); + } +} +``` +--->在Views里建一个文件夹Blogs-->在建一个文件index.cshtml +```js +神级预判 +//html网页地址http://localhost:5000/Blogs/index +``` +## 9. +> 给第8题的新控制,添加一个新的Action,名为Music,不接受任何参数,并返回对应的视图,视图显示“顶级打野” +-->在Controllers里的一个文件Blogs.cs里 +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class Blogs:Controller{ + public IActionResult Index() + { + return View(); + } + public IActionResult Music() + { + return View(); + } +} +``` +--->在Views里建一个文件夹Blogs-->在建一个文件Music.cshtml +```js +顶级打野 +//html网页地址http://localhost:5000/Blogs/Music +``` +## 11. +> 新增一个控制器,名为Products,该控制器具有一个名为Edit的Action,这个Action接受一个int类型的参数id,显示这个id +```js + public IActionResult Edit( int id){ + return Content(id.ToString()); + } +``` +## 12. +> 在11题的新控制器中,新增一个名为Create的Action,该Action接受一个类型为Students(有姓名、年龄、体长属性)的参数,并展示该参数的姓名属性 +### [显示效果]![MVC练习12](./MVC练习显示效果/MVC练习-12.PNG) +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ + public Students Create(int id) + { + var students=new Students + { + Name="小白", + Age="20", + Height = "185" + }; + return students; + } + [HttpPost] + public IActionResult Create([FromBody] Students students){ + return View(students); + } +} + + public class Students +{ + public string Name { get;set;}=null!; + public string Age { get;set;}=null!; + public string Height { get;set;}=null!; +} +``` +# 控制器传参练习 +## 1. +> 简单参数传递 在一个叫Blog控制器中,定义一个叫Index的Action,并且传递一个int类型的值,id为变量名 +```js + public IActionResult Index( int id){ + return Content(id.ToString()); + } +//html页面中在网址上输入数字(http://localhost:5000/baby/index/12345)会在页面上显示12345 +``` +## 2. +> 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_2的Action,并且传递一个string类型的值,id为变量名 +```js + public IActionResult Index_2( string id){ + return Content(id.ToString()); + } +//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 +``` +## 3. +> 简单参数传递 在一个叫Blog控制器中,定义一个叫Index_3的Action,并且传递一个string类型的值,name为变量名 +**注意:**变量名改了得在Program.cs里的` pattern: "{controller=Home}/{action=Index}/{name?}");`修改 +```js + public IActionResult Index_3( string name){ + return Content(id.ToString()); + } +//html页面中在网址上输入字符串类型的(http://localhost:5000/baby/index_2/fgdgd123)会在页面上显示fgdgd123 +``` +## 4. +> 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create的Action,并且传递一个BlogCreateDto类型的值,blogCreateDto为变量名; +PS: BlogCreateDto类型具有Title、Author、Content自动属性 +[显示效果]![控制器传参任务4](./MVC练习显示效果/控制器传参-4.PNG) +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create([FromBody] BlogCreateDto blogCreateDto){ + return View(blogCreateDto); + } + public IActionResult Index( int id){ + var blogCreateDto=new BlogCreateDto{ + Author="小红", + Title="果敢", + Content="人生不就是白干加白干" + }; + return View(blogCreateDto); + } +} +// 定义类型 + public class BlogCreateDto{ + public string Title{get;set;}=null!; + public string Author{get;set;}=null!; + public string Content{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.BlogCreateDto; + +

@Model.Title

+@Model.Author +@Model.Content +``` +## 5. +> 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_1的Action,并且传递一个Products类型的值,productCreateDto为变量名 +PS: Products类型具有Name、Price、Stock自动属性 +[显示效果]![控制器传参任务4](./MVC练习显示效果/控制器传参-5.PNG) +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create_1([FromBody] Products productCreateDto){ + return View(productCreateDto); + } + public IActionResult Index( int id){ + var productCreateDto=new Products{ + Name="橡皮擦", + Price="2¥", + Stock="200个" + }; + return View(productCreateDto); + } +} +// 定义类型 + public class Products{ + public string Name{get;set;}=null!; + public string Price{get;set;}=null!; + public string Stock{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.Products; + +

商品:@Model.Name

+价格:@Model.Price +库存:@Model.Stock +``` +## 6. +> 复杂参数传递 在一个叫Blog的控制器中,定义一个名为Create_2的Action,并且传递一个Students类型的值,studentCreateDto为变量名 +PS: Students类型具有StudentName、Sex、Age自动属性 +[显示效果]![控制器传参任务4](./MVC练习显示效果/控制器传参-6.PNG) +**在控制器中输入** +```js +using Microsoft.AspNetCore.Mvc; +namespace Blog.Controllers; +public class BabyController:Controller{ +//视图显示 + [HttpPost] + public IActionResult Create_2([FromBody] Students studentCreateDto){ + return View(studentCreateDto); + } + public IActionResult Index( int id){ + var studentCreateDto=new Students{ + StudentName="蓝蓝", + Sex="女", + Age="18" + }; + return View(studentCreateDto); + } +} +// 定义类型 + public class Students{ + public string StudentName{get;set;}=null!; + public string Sex{get;set;}=null!; + public string Age{get;set;}=null!; + } +``` +**在views里的Baby的Index.cshtml中** +```js +@model Blog.Controllers.Students; + +

姓名:@Model.StudentName

+性别:@Model.Sex +年龄:@Model.Age +``` + diff --git "a/\347\250\213\346\242\246/20241125_Action\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213(\344\274\240\345\217\202).md" "b/\347\250\213\346\242\246/20241125_Action\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213(\344\274\240\345\217\202).md" index 29413c4c40d06eada9507f079e3f96ea60b59b71..86e0be9bc73b2d29da2d4a2143523952fbb43857 100644 --- "a/\347\250\213\346\242\246/20241125_Action\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213(\344\274\240\345\217\202).md" +++ "b/\347\250\213\346\242\246/20241125_Action\350\277\224\345\233\236\345\200\274\347\261\273\345\236\213(\344\274\240\345\217\202).md" @@ -97,3 +97,210 @@ public ActionResult > Edit(){ } } ``` + +# 基础能力 +> 1. 生成一个随机整数,范围[0,100],注意是否包含 +## [显示效果] ![基础能力1](./MVC练习显示效果/基础能力-随机1.gif) +**在控制器里** +```js + //方法一: + [HttpGet] + public ActionResult Getrandomnumber(){ + Random random=new Random(); + // int randomNumber =random.Next(包含,不包含); + int randomNumber =random.Next(0,101); + return View(randomNumber); + } + // 方法二: + public string Rndnumber(){ + var rannumber=new Random(); + int number=rannumber.Next(0,101); + return number.ToString(); + } +``` +**在Views的GetRandomNumber.cshtml** +```js +@model int + +

[0,100]随机数:

@Model +``` +> 2. 生成一个随机整数,范围(0,100],注意是否包含 +```js + [HttpGet] + public ActionResult Getrandomnumber(){ + Random random=new Random(); + int randomNumber=random.Next(1,101); + return View(randomNumber); + } +``` +**在Views的GetRandomNumber.cshtml** +```js +@model int + +

(0,100]随机数:

@Model +``` +> 3. 生成10个随机整数,范围[5,80],注意是否包含 +## [显示效果] ![基础能力1](./MVC练习显示效果/基础能力-随机3.gif) +```js + [HttpGet] + public ActionResult > Getrandomnumber(){ + //创建一个Random对象生成随机数 + Random random=new Random(); + //创建一个列表来存储随机数 + List randoms=new List(); + for (int i = 0; i < 10; i++) + { + int randomNumber=random.Next(5,81); + //将生成的随机数增加到列表里 + randoms.Add(randomNumber); + } + return View(randoms); + } +``` +**在Views的GetRandomNumber.cshtml** +```js +@model List +

生成10个随机整数,范围[5,80]

+ @foreach (var number in Model) + { + @number、; + } +``` +> 4. 定义一个字符串,字符串中有100个中文字符,需要从中随机取1个字符串 +## [显示效果] ![基础能力1](./MVC练习显示效果/基础能力-随机4.gif) +```js + //方法一: + private string MakeStr(int strindex) + { + var Str = "是每个庭院夜深时说的话是谁躲在角落忍着偷把眼泪檫"; + var rndstr = Str[strindex]; + return rndstr.ToString(); + } + public string RanStr() + { + var rnd = new Random(); + int rndNum = rnd.Next(0,25); + var res = MakeStr(rndNum); + return res; + } + //方法二: + public string RndStr(){ + var Str="是每个庭院夜深时说的话是谁躲在角落忍着偷把眼泪檫"; + var rnd=new Random(); + int rndnumber=rnd.Next(0,Str.Length+1); + var rndstr=Str[rndnumber]; + return rndstr.ToString(); + } +``` +> 5. 定义一个字符串,字符串中有100个中文字符,需要从中随机取5-50个字符,组成新的字符 +## [显示效果] ![基础能力1](./MVC练习显示效果/基础能力-随机5.gif) +```js + //方法一: + public string MakeStr2() + { + var Str = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经房裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄曲家封芮羿储靳汲邴糜松井段富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭历戎祖武符刘景詹束龙叶幸司韶郜黎蓟溥印宿白怀蒲邰从鄂索咸籍赖卓蔺屠蒙池乔阳郁胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍郤璩桑桂"; + var rnd = new Random(); + int rndNum = rnd.Next(5, 51); + string newstr = ""; + for (int i = 0; i < rndNum; i++) + { + int strindex = rnd.Next(0, Str.Length + 1); + newstr += Str[strindex]; + } + return newstr; + } + //方法二: + public ActionResult MakeStr(){ + var Str="赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经房裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄曲家封芮羿储靳汲邴糜松井段富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭历戎祖武符刘景詹束龙叶幸司韶郜黎蓟溥印宿白怀蒲邰从鄂索咸籍赖卓蔺屠蒙池乔阳郁胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍郤璩桑桂"; + var rnd=new Random(); + int rndNum=rnd.Next(5,51); + List rndstrs=new List();//由于用到了ToArray()方法所以要转换类型char + for (int i = 0; i < rndNum; i++) + { + int strindex=rnd.Next(0,Str.Length+1); + rndstrs.Add(Str[strindex]);//因为这边是单个字符类型而不是字符串类型 + } + string newstr=new string(rndstrs.ToArray());//构建新字符串、ToArray():将集合转换为数组,返回整数类型 + return Ok(newstr); + } +``` +> 6. 定义2个字符串,第一个字符串中放百家姓,第二个字符串中放中文字符,要求从第一个字符串随机取得一个姓,再从第二个字符串中随机获得1到2个字符组成新字符串,和第一个字符串取得的姓组成一个姓名 +## [显示效果] ![基础能力1](./MVC练习显示效果/基础能力-随机6.gif) +```js + public string FirstStr() + { + var Str = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑"; + var rnd = new Random(); + int rndnum = rnd.Next(0, Str.Length + 1); + var rndstr = Str[rndnum]; + return rndstr.ToString(); + } + + // public string MakeStr() + // { + // var Str = "中华儿女多奇志不爱红装爱武装横眉冷对千夫指俯首甘为孺子牛江山代有才人出各领风骚数百年海内存知己天涯若比邻路漫漫其修远兮吾将上下而求索"; + // var rnd = new Random(); + // int rndnum = rnd.Next(0, Str.Length + 1); + // var rndstr = Str[rndnum]; + // return rndstr.ToString(); + // } + + public string MakeName() + { + var Str = "中华儿女多奇志不爱红装爱武装横眉冷对千夫指俯首甘为孺子牛江山代有才人出各领风骚数百年海内存知己天涯若比邻路漫漫其修远兮吾将上下而求索"; + var rnd = new Random(); + int rndnum = rnd.Next(0, Str.Length + 1); + var rndstr = Str[rndnum]; + var strLong = rnd.Next(1, 3); + string newstring = ""; + for (int i = 0; i < strLong; i++) + { + newstring += rndstr; + // newstring +=MakeStr(); + } + return newstring; + } + public string NewName() + { + var fname = FirstStr(); + var sname = MakeName(); + var newname = fname + sname; + return newname; + } +``` + +# 练习-控制器返回值 +## 1. 控制器返回值-渲染简单数据到页面 +[显示效果]![控制器返回值1](./MVC练习显示效果/控制器返回值-1.png) +```js + public string Page1() + { + return "吃早饭了吗?"; + } +``` +## 2. 控制器返回值-渲染复杂数据到页面 +[显示效果]![控制器返回值2](./MVC练习显示效果/控制器返回值-2.png) +```js + public dynamic Page2() + { + return new + { + Id = 18, + name="xxx" + }; + } +``` +## 3. 控制器返回值-渲染集合数据到页面 +[显示效果]![控制器返回值3](./MVC练习显示效果/控制器返回值-3.png) +```js + public List Page3(){ + var students=new List(){ + "小红", + "18", + "185" + }; + return students; + } +``` + + diff --git "a/\347\250\213\346\242\246/20241127_\351\232\217\346\234\272(\345\255\227\347\254\246\344\270\262&\346\225\264\346\225\260)&\345\256\232\344\275\215\347\202\271.md" "b/\347\250\213\346\242\246/20241127_\351\232\217\346\234\272(\345\255\227\347\254\246\344\270\262&\346\225\264\346\225\260)&\345\256\232\344\275\215\347\202\271.md" new file mode 100644 index 0000000000000000000000000000000000000000..1a7bc2a93436b51ef2600e565b99b392f44e36c7 --- /dev/null +++ "b/\347\250\213\346\242\246/20241127_\351\232\217\346\234\272(\345\255\227\347\254\246\344\270\262&\346\225\264\346\225\260)&\345\256\232\344\275\215\347\202\271.md" @@ -0,0 +1,22 @@ +# 字符串渲染页面(简单) +```js +public string GenStr(){ + return "sdfds52"; +} +``` +# 字符串渲染页面(指定) +```js +public string MakeStr(){ + var str="爱是时间的古董"; + var rndstr=str[3]; //页面显示-->间 + return rndstr.ToString(); +} +``` +# 定位点(cshtml里) +```js +//页面地址显示(localhost:5000/baby/create/12);页面显示跳转查看;点击切换create.cshtml里的视图 +跳转查看 + +//页面地址显示(localhost:5000/baby/create);页面显示切换查看;点击切换create.cshtml里的视图 +切换查看 +``` \ No newline at end of file diff --git "a/\347\250\213\346\242\246/20241129_\345\270\256\345\212\251\347\250\213\345\272\217(\345\242\236&\345\210\240&\346\224\271).md" "b/\347\250\213\346\242\246/20241129_\345\270\256\345\212\251\347\250\213\345\272\217(\345\242\236&\345\210\240&\346\224\271).md" new file mode 100644 index 0000000000000000000000000000000000000000..c5cbc3b3a475a049b2bd65d2321bf30f5fcc93bd --- /dev/null +++ "b/\347\250\213\346\242\246/20241129_\345\270\256\345\212\251\347\250\213\345\272\217(\345\242\236&\345\210\240&\346\224\271).md" @@ -0,0 +1,164 @@ +# 帮助程序(新增) +1. 先在Models里(Blogs.cs)定义类型,建一个命名空间-->在建一个模拟数据库(Db.cs) +```js +//模拟数据库 + public static class Db + { + //静态构造函数,只执行一次 + public static List Blogs{get;set;} + static Db() + { + //初始化静态属性 + Blogs=new List(); + //给这个集合属性,塞进一些Blogs + for(int i=0;i<15;i++) + { + var tmp=new Blogs + { + Id=i+1, + Title="xxxx", + Content="xxxxxxxx" + } + Blogs.Add(tmp); + } + } + } +``` +2. 再在控制器中(BlogsController.cs)定义返回值类型 +3. 在Views里(Blogs/Index.cshtml)-->制定表单所需要的网页 +4. 表格样式可在(wwwroot/css/)写-->建一个(base.css)写样式美化【若要在Views里引用样式则】 +5. 在2的控制器中健Create的返回类型-->Views里新增网页-->返回Index,渲染新增数据到页面 +```js +//Create 返回类型:(Create.cshtml) +//在新增的cshtml里制一个新增网页后在控制器中post请求 + //先声明 +@model Blog.Models.Blogs; + + + +//控制器中 + [HttpPost] + public IActionResult Create(Blogs input) + { + var maxId=Db.Blogs.Select(t=>t.Id).Max(); + input.Id=maxId+1; + Db.Blogs.Add(input); + //返回Index + return RedirectToAction("Index"); + } +``` +# 专业项练习-视图及其模板引擎 +## 1. 渲染(展示)简单数据类型到视图 +[显示效果]![渲染数据到视图](./MVC练习显示效果/渲染数据到视图-1.png) +```js +//在控制器里 + public IActionResult Index2(){ + var message=new Babyindex2{ + Name="小白", + Age=18 + }; + return View(message); + } +//在Models里Babyindex.cs +public class Babyindex2 +{ + public string Name{get;set;}=null!; + public int Age{get;set;} +} +//在Views里Index2.cshtml +@model Babyindex2 +

姓名:@Model.Name

+

年龄:@Model.Age

+``` +## 2. 渲染(展示)对象数据到视图 +[显示效果]![渲染数据到视图](./MVC练习显示效果/渲染数据到视图-2.png) +```js + public IActionResult Index2(int id){ + // 根据id从数据库获取用户信息 + // 创建一个示例用户对象 + var message=new Babyindex2{ + Name="小蓝", + Age=22 + }; + return View(message); + } + public class Babyindex2 +{ + public string Name{get;set;}=null!; + public int Age{get;set;} +} +@model Babyindex2 +

姓名:@Model.Name

+

年龄:@Model.Age

+``` +## 3. 渲染(展示)集合数据到视图 +[显示效果]![渲染数据到视图](./MVC练习显示效果/渲染数据到视图-3.png) +```js + public IActionResult Index2(){ + var messages=new List + { + new Babyindex2{Name="小黑",Age=30}, + new Babyindex2{Name="小紫",Age=40} + }; + return View(messages); + } + public class Babyindex2 +{ + public string Name{get;set;}=null!; + public int Age{get;set;} +} + @model List +
    +@foreach(var message in Model) +{ +
  • 姓名:@message.Name
  • +
  • 年龄:@message.Age
  • +} +
+``` +## 4. 渲染(展示)包含集合数据的对象数据到视图 +[显示效果]![渲染数据到视图](./MVC练习显示效果/渲染数据到视图-4.png) +```js + public IActionResult Index2(int id){ + var user=new Babyindex2 + { + Name="小绿", + Age=50, + foods=new List + { + new Foods{FoodsCount=2,FoodsName="苹果"}, + new Foods{FoodsCount=10,FoodsName="糖果"} + } + }; + return View(user); + } +//在Models里Babyindex.cs +public class Babyindex2 +{ + public string Name{get;set;}=null!; + public int Age{get;set;} + public List foods{get;set;}=null!; +} + +public class Foods +{ + public int FoodsCount{get;set;} + public string FoodsName{get;set;}=null!; +} +//在Views里Index2.cshtml +@model Babyindex2 +

姓名:@Model.Name

+

年龄:@Model.Age

+
    + @foreach (var users in Model.foods) + { +
  • 个数:@users.FoodsCount
  • +
  • 名称:@users.FoodsName
  • + } +
+``` +## 5. 尝试构建如下图所示的经典CRUD列表 +[显示效果]![渲染数据到视图](./MVC练习显示效果/渲染数据到视图-4.png) +```js + +```