.net5 core Razor项目实战系列之六:部门管理功能的实现(新增和修改功能)
本篇实现新增和修改的功能。
在部门列表页增加一个新增按钮,用户点击后弹出一个新增部门的页面 DeptEdit.cshtml,
考虑到修改部门信息的时候可以复用此页面,故在新增的时候传递一个参数 deptid=0,
在列表页每行的末尾增加一个修改按钮,点击的时候调用 DeptEdit.cshtml 页面并传值 deptid=xxx,
这样在DeptEdit.cshtml 页可以通过判断是否 deptid>0 来决定页面是做新增还是修改的操作,列表页的效果如下:
DeptList.cshtml页面代码如下(见红色部分):
@page @model AuthManagement.Pages.Auth.DeptListModel @using AuthManagement.DbUtil.Entity @{ ViewData["Title"] = "部门管理"; } <table border="1" width="60%"> <tr style="background-color:antiquewhite;height:40px;"> <td>编号</td> <td>名称</td> <td>创建时间</td> <td><a href="/Auth/DeptEdit?deptid=0" target="_blank">新增部门</a></td> </tr> @foreach (TDept item in Model.DeptList) //遍历输出部门信息 { <tr style="height:30px;"> <td>@item.DeptId</td> <td>@item.DeptName</td> <td>@item.CreateTime</td> <td> <a href="/Auth/DeptEdit?deptid=@item.DeptId" target="_blank">修改</a> <a href="/Auth/DeptList?deptid=@item.DeptId" target="_self" onclick="return confirm('确定要作废吗?');">作废</a> </td> </tr> } @if (Model.DeptList.Count == 0) { <tr style="height:30px;"> <td colspan="4" align="center">没有查询到部门数据!</td> </tr> } </table>
在Auth文件夹下新增 DeptEdit.cshtml 文件,代码如下:
@page @model AuthManagement.Pages.Auth.DeptEditModel @{ Layout = null; //本页面不需要使用布局页,设为null就可以了 } <form method="post"> <!--这里不用加 action 属性,因为按 Razor 的规则,以Post方式提交的表单,自动匹配到.cs文件中的OnPost()方法--> <table style="width:400px;border-collapse: collapse;border: solid 1px #c0c0c0;"> <tr style="background-color:antiquewhite;height:40px;"> <td> @Model.SubjectName</td> </tr> <tr style="height:30px;border:solid 1px #c0c0c0;"> <td style="font-size:15px;"> 部门名称: <input type="text" style="font-size:15px;" size="25" maxlength="10" name="deptname" value="@Model.DeptName" /> </td> </tr> <tr style="height:30px;border:solid 1px #c0c0c0;"> <td align="center"> <button type="submit">保存</button> <button onclick="javascript: window.close();">关闭</button> </td> </tr> </table> </form>
DeptEdit.cshtml.cs中的编码如下:
namespace AuthManagement.Pages.Auth { public class DeptEditModel : PageModel { private readonly AuthDbContext _context; //构造函数中对AuthDbContext做依赖注入 public DeptEditModel(AuthDbContext context) { _context = context; } public string SubjectName { get; set; } // 将主题信息传递到页面中,赋值在OnGet()完成 public string DeptName { get; set; } //将部门信息传递到页面中,主要用于修改的时候将部门名称初始化到输入框 public void OnGet() { SubjectName = "新增部门"; DeptName = ""; string deptId = Request.Query["deptid"]; if (int.TryParse(deptId, out int did)) { if (did > 0) { SubjectName = "修改部门"; //如果是点修改进来的就根据部门编号到数据库拿到部门信息后初始化部门名称 TDept dept = _context.TDepts.Find(did); DeptName = dept.DeptName; } } } } }
运行页面,点新增时画面如下:
点修改时画面如下:
当用户输入部门名称后点"保存"按钮,代码如下:
public void OnPost() { string deptName = Request.Form["deptname"]; string deptId = Request.Query["deptid"]; if (int.TryParse(deptId, out int did)) { if (did > 0) //传递过来的deptid值 >0 则修改,否则新增。 { ModifyDept(did, deptName); } else { int newDeptId = AddDept(deptName); deptId = newDeptId.ToString(); } } //执行完之后让页面重新加载一下避免用户刷新的时候数据再次回传 Response.Redirect("/Auth/DeptEdit?deptid="+ deptId); } //新增部门 private int AddDept(string deptName) { TDept dept = new TDept { DeptName = deptName, IsValid = 1, CreateTime = DateTime.Now }; _context.TDepts.Add(dept); _context.SaveChanges();
return dept.DeptId; //返回部门编号以便OnPost()中刷新页面的时候显示刚新增的这个部门名称 } //修改部门 private void ModifyDept(int deptId, string deptName) { //设置序列化时的对中文的编码方式 JsonSerializerOptions options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), }; List<TLog> logList = GenerateLog(); //初始化包含2条日志信息的列表 //先找出要更改的实体 TDept dept = _context.TDepts.Find(deptId); //将更改前的数据序列化成json后记录下来 logList[0].TableData = JsonSerializer.Serialize<TDept>(dept, options); //给要更改的属性赋值 dept.DeptName = deptName; dept.ModifyTime = DateTime.Now; //将更改后的数据序列化成json后记录下来 logList[1].TableData = JsonSerializer.Serialize<TDept>(dept, options);
//保存数据到t_log表 _context.TLogs.AddRange(logList); //将更改保存到数据库 _context.SaveChanges(); } /// <summary> /// 将更改前和更改后的数据保存到t_log表 /// </summary> /// <returns></returns> private List<TLog> GenerateLog() { string batchNo = Guid.NewGuid().ToString(); TLog beforeLog = new TLog { UserId = 6,//因为没有做登录功能无法获取 UserID 和 UserName,先写死,后续增加登录功能后再修改这里。 UserName = "赵六", BatchNo = batchNo, TableName = "t_dept", TableData = "", LogTime = DateTime.Now }; TLog afterLog = new TLog { UserId = 6, UserName = "赵六", BatchNo = batchNo, TableName = "t_dept", TableData = "", LogTime = DateTime.Now }; List<TLog> logList = new List<TLog>(); logList.Add(beforeLog); logList.Add(afterLog); return logList; }
分类:
.net5.0 Razor 系列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人