接下來,我們在列表頁面上加一些功能,來實現對部門信息的增刪改查操作。
先實現作廢功能。
在列表的每一行末尾增加一個作廢按鈕,點作廢的時候彈出是否要作廢的提示,如果用戶點是,
執行作廢的操作(作廢之前要先判斷是否有被用到),然后刷新部門列表。
因為作廢后要還是要回到部門列表頁,所以干脆就將作廢功能放在 DeptList.cshtml 頁面來完成,
在實現上只要調用 DeptList.cshtml 並將部門編號作為參數傳遞過去就可以了。
代碼如下:
1. 作廢功能(紅色標記的是新增的部分)
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> </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/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>
DeptList.cshtml.cs文件代碼如下:
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Text.Encodings.Web; using System.Text.Unicode; using AuthManagement.DbUtil.Entity; namespace AuthManagement.Pages.Auth { public class DeptListModel : PageModel { private readonly AuthDbContext _context; //構造函數中對AuthDbContext做依賴注入 public DeptListModel(AuthDbContext context) { _context = context; } //定義部門列表屬性,用於傳遞給.cshtml頁面使用(在OnGet()方法中賦值) public IList<TDept> DeptList { get; set; } public void OnGet() { string deptId = Request.Query["deptid"]; if (int.TryParse(deptId, out int did)) //如果該參數是一個數字說明是點作廢后進來的 { //先查詢該部門下是否能找到任何一個有效的User TUser user = _context.TUsers.Where<TUser>(user => user.DeptId == did && user.IsValid==1).FirstOrDefault<TUser>(); //如果沒有找到才能執行作廢的操作 if (user == null) { UpdateByFind(did); //也可以使用 UpdateDirectly() 方法更新數據庫 } } //作廢的部門不顯示,所以這里用 Where() 函數處理條件查詢 //參數是一個 Lambda 表達式,查詢 is_valid=1 即未作廢的部門數據。 DeptList = _context.TDepts.Where<TDept>(dept => dept.IsValid == 1).ToList<TDept>(); } //此方法更新時只會連接1次數據庫並更新指定的字段 private void UpdateDirectly(int deptId) { //將要更新的字段及主鍵賦值 TDept dept = new TDept { DeptId = deptId, IsValid = 0, ModifyTime = DateTime.Now }; //跟蹤實體 dept 的狀態 _context.TDepts.Attach(dept); //標記要更改的屬性是 IsValid 和 ModifyTime,不做標記即使賦值了也不會更改 _context.Entry<TDept>(dept).Property(dept => dept.IsValid).IsModified = true; _context.Entry<TDept>(dept).Property(dept => dept.ModifyTime).IsModified = true; //將更改保存到數據庫 _context.SaveChanges(); } /// <summary> /// 此方法更新時會連接2次數據庫並更新所有的字段。 /// 因為要寫日志表,故調用這個方法更合適。 /// </summary> /// <param name="deptId"></param> private void UpdateByFind(int deptId) { //設置序列化時的對中文的編碼方式 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.IsValid = 0; 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 = 1, //因沒有處理登錄,這里用模擬數據 UserName = "張三", BatchNo = batchNo, TableName = "t_dept", TableData = "", LogTime = DateTime.Now }; TLog afterLog = new TLog { UserId = 1, UserName = "張三", BatchNo = batchNo, TableName = "t_dept", TableData = "", LogTime = DateTime.Now }; List<TLog> logList = new List<TLog>(); logList.Add(beforeLog); logList.Add(afterLog); return logList; } } }
編譯后運行程序,效果如下:

點確定后數據庫的 t_log 表生成了2條記錄,如下:

