# WebApplicationKG **Repository Path**: sanzk/WebApplicationKG ## Basic Information - **Project Name**: WebApplicationKG - **Description**: ASP.NET MVC练习程序 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-02-12 - **Last Updated**: 2025-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ASP.NET MVC #### 项目地址 https://gitee.com/sanzk/asp.-net-mvc.git 视频地址: 【.NET MVC】 https://www.bilibili.com/video/BV183SSYpEw1/?p=7&share_source=copy_web&vd_source=842382bf376aef11984b2f313902fc33 #### 软件架构 ![输入图片说明](README/1.PNG) ![输入图片说明](README/2.PNG) ![输入图片说明](README/3.PNG) ## 新建示例项目 第一步:添加新控制器 第二步: public IActionResult Index() 更名为 public IActionResult Demo01() 第三步: 给Demo01控制器添加Razor视图 ... ### viewdate绑定数据 ### viewbag绑定数据 @ViewBag.Emp是动态数据 控制器: ``` ViewBag.Info= "这是我的第一个MVC程序"; ViewBag.Emp = emp; ``` 视图: ```

@ViewBag.Info

员工基本信息如下:

编号:@ViewBag.Emp.EmpId

姓名:@ViewBag.Emp.EmpName

电话:@ViewBag.Emp.EmpPhone

``` ### TempData数据传递 viewdate、 viewbag 只能在当前Action中传递数据 Tempdate可以跨Action传递数据 赋值: ``` #region 用于处理登录的请求 public IActionResult Login() { //假设用户名和密码都是admin可以登录成功,否则登录失败 string acc=Request.Form["txtAccount"]; string pwd = Request.Form["txtPwd"]; if (acc.Equals("admin") && pwd.Equals("admin")) { //跳转 return RedirectToAction("WelcomeForm"); } else { //提示 TempData["ErrInfo"] = "用户名或密码错误!"; return RedirectToAction("LoginForm"); } } #endregion ``` 使用: ``` @TempData["ErrInfo"] ``` ### 同名Action 使用请求方式的不同区分两个同名Action ``` [HttpGet] //区别1, public IActionResult DL() //区别2,参数不一样 ``` ``` [HttpPost] public IActionResult DL(string acc ,string pwd) ``` ## Linq和Lambda 对数据的操作会频繁使用Linq和Lambda语法 ### 1. 使用Linq和Lambda语法筛选数组 ``` //使用Linq筛选数组中50-80的数据 var linqRes=from v in arr where v>=50 && v<80 select v; ViewBag.linqRes = linqRes; //使用Lambda筛选数组中50-80的数据 var lambdaRes = arr.Where(p => (p >= 50 && p <= 80)); ViewBag.lambdaRes = lambdaRes; ``` ### 2. 使用Linq和Lambda进行条件查询 ![输入图片说明](README/22.PNG) ``` #region 查询工资在5000及以上,电话以132开头的员工信息 public IActionResult Demo02() { List list=new List list=LoadEmployee(); // } ``` ## EF框架基础 ORM概述: ORM全称是:对象-关系映射 ORM是将关系数据库中的数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。 Enity Framework(简称EF): ASP.NET MVC应用程序推荐使用ORM框架; ### 资料准备 ``` create table Dept --部门信息 ( DeptId int primary key identity(1,1), DeptName varchar(50) not null ) create table Employee --员工信息 ( EmpId int primary key identity(1,1), DeptId int not null, EmpName varchar(50) not null, EmpPhone varchar(50) not null, EmpArea varchar(50) not null, EmpSalary decimal(18,2) not null ) insert into Dept(DeptName) values('开发部') insert into Dept(DeptName) values('测试部') insert into Dept(DeptName) values('实施部') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(1,'刘德华','13887855552','武汉','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(2,'张学友','13556528634','深圳','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(3,'刘亦菲','13448494546','广州','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(1,'周杰伦','13888666855','北京','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(2,'许巍','13868654219','上海','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(3,'孙燕姿','13895133572','成都','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(1,'朴树','13458788896','武汉','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(2,'周润发','13554588745','南京','6500') insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary) values(3,'李连杰','13998759654','上海','6500') select * from Dept select * from Employee ``` ### EF框架的安装 ![EF框架的安装](README/21.PNG) 使用命令安装dotnet-ef(实际上是无效的操作) ``` //项目--右键--在终端打开--输入下面命令 dotnet tool install --global dotnet-ef --version 7.0.9 //直接在Nuget管理中点击安装会报错 ``` 报错,vs2022已安装9.0.1版本,且不可卸载,所以7.0.9版本是无法安装的。其实不按照7.0.9版本仍可以正常使用 生成文件 1.1 ``` dotnet ef dbcontext scaffold "Data Source=SAN-PC\WINCCPLUSMIG2014;Initial Catalog=DBTEST;Persist Security Info=True;User ID=sa;Password=sa;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models ``` 笔记:Data Source=.是用不了的,改成 Data Source=SAN-PC\WINCCPLUSMIG2014才可以用 1.2 另外appsetting.json文件也做了修改 ``` { "ConnectionStrings": { "DefaultConnection": "Server=SAN-PC\\WINCCPLUSMIG2014;Database=DBTEST;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" ``` ## 三. linq和lambda进行条件查询 ## 四. linq和lambda进行排序 Chp02Controller.cs ``` #region 先安照工资降序,后按照编号的降序进行排列 public IActionResult Demo03() { List list= new List();//创造数据 list = LoadEmployee();//加载数据 //linq(ascending:正序;descending:倒序) var listLinq= from emp in list orderby emp.EmpSalary descending,emp.EmpId descending select emp; ViewBag.listLinq= listLinq; //lambda(OrderBy:正序;OrderByDescending:倒序;第二次排序使用ThenBy) var listLambda=list.OrderByDescending(p=>p.EmpSalary).ThenByDescending(p=>p.EmpId); ViewBag.listLambda= listLambda; return View(); } #endregion ``` Demo03.cshtml ```

使用Linq查询员工信息,先安照工资降序,后按照编号的降序进行排列

@foreach (var item in ViewBag.listLinq) { }
员工编号: 部门编号: 姓名: 电话: 工资:
@item.EmpId @item.DeptId @item.EmpName @item.EmpPhone @item.EmpSalary

使用Lambda查询员工信息,先安照工资降序,后按照编号的降序进行排列

@foreach (var item in ViewBag.listLambda) { }
员工编号: 部门编号: 姓名: 电话: 工资:
@item.EmpId @item.DeptId @item.EmpName @item.EmpPhone @item.EmpSalary
``` ## 五. linq和lambda进行分组 Chp02Controller.cs ``` #region 使用linq和lambda进行分组 public IActionResult Demo04() { //按照部门编号分组显示 List list = new List();//创造数据 list = LoadEmployee();//加载数据 //linq方式 var listLinq = from emp in list group emp by emp.DeptId; ViewBag.listLinq= listLinq; //lambda方式 var listLambda = list.GroupBy(p => p.DeptId); ViewBag.listLambda= listLambda; return View(); } #endregion ``` Demo04.cshtml ```

按照部门编号分组显示员工信息

@foreach (var myList in ViewBag.listLinq) { @foreach (var item in myList) {

部门编号:@item.DeptId

break; } @foreach (var item in myList) { }
员工编号 部门编号 员工姓名 员工电话 员工工资
@item.EmpId @item.DeptId @item.EmpName @item.EmpPhone @item.EmpSalary
} ``` ## 五. linq和lambda进行分组加聚合条件 按照部门编号分组显示员工信息(只查询平均工资在5000及以上的组) ``` //linq方式 var listLinq = from emp in list group emp by emp.DeptId into g where g.Average(p => p.EmpSalary) >= 5000 select g; ViewBag.listLinq = listLinq; lambda先安照工资降序,后按照编号的降序进行排列 ``` ## 六. 匿名类集合的显示 实体类中(模型中)不存在的数据要想显示在表格中,需要使用到匿名类。 ``` @{ Layout = null; } Demo06

按照部门编号分组显示员工信息 (只查询平均工资在5000及以上的组)linq

@foreach (var item in ViewBag.listRes) { }
员工编号 部门编号 员工姓名 员工电话 员工工资 实发工资
@item.EmpId @item.DeptId @item.EmpName @item.EmpPhone @item.EmpSalary @item.EmpSFGZ
``` ## 七、联表查询 控制器 ``` #region Demo07 联表查询 public IActionResult Demo07() { List listDept = new List();//创造数据 listDept = LoadDept();//加载数据 List listEmp= new List(); listEmp= LoadEmployee(); //Linq语法 //var listView = from emp in listEmp // join dept in listDept on emp.DeptId equals dept.DeptId // select new // { // EmpId = emp.EmpId, // DeptId = emp.DeptId, // DeptName=dept.DeptName, // EmpName = emp.EmpName, // EmpPhone = emp.EmpPhone, // EmpSalary = emp.EmpSalary // }; //ViewBag.listView = listView; //lambda方式 var listView = listEmp.Join(listDept, emp => emp.DeptId, dept => dept.DeptId, (emp, dept) => new { EmpId = emp.EmpId, DeptId = emp.DeptId, DeptName = dept.DeptName, EmpName = emp.EmpName, EmpPhone = emp.EmpPhone, EmpSalary = emp.EmpSalary }); ViewBag.listView = listView; return View(); } #endregion ``` 视图 ``` @{ Layout = null; } Demo07 @foreach (var item in ViewBag.listView) { }
员工编号 部门名称 姓名 电话 工资
@item.EmpId @item.DeptName @item.EmpName @item.EmpPhone @item.EmpSalary
``` ## 八、分组加聚合 工资总和、平均工资、最高工资、最低工资 就是聚合函数求出的结果,然后按部门进行分组。 # chp07 模型的绑定和验证 将表单直接转化为.net类 ## 模型绑定获取表单数据 ## 基本类型获取数据 # 文件上传 ## 1. 基本文件上传功能 控制器 ``` public IActionResult Demo03() {//需要设置form enctype="multipart/form-data"才能正常提交文件 return View(); } public IActionResult Demo03Save(IFormFile fileImg) { //获取文件名 string fileName=fileImg.FileName; //获取后缀名 string fileExt=Path.GetExtension(fileName); //重新生成文件名 fileName = Guid.NewGuid().ToString()+fileExt; //上传文件到服务器 string filePath = Path.Combine(Directory.GetCurrentDirectory(),"wwwroot/uploads",fileName); using(var stream=new FileStream(filePath, FileMode.Create)) { fileImg.CopyTo(stream); } TempData["FileName"] = fileName; return RedirectToAction("Demo03"); } ``` 视图 ``` @{ Layout = null; } Demo03
图片上传
请选择图片:
@TempData["FileName"]
```