.net5 core Razor項目實戰系列之五:部門管理功能的實現(作廢功能)


接下來,我們在列表頁面上加一些功能,來實現對部門信息的增刪改查操作。

先實現作廢功能。

在列表的每一行末尾增加一個作廢按鈕,點作廢的時候彈出是否要作廢的提示,如果用戶點是,

執行作廢的操作(作廢之前要先判斷是否有被用到),然后刷新部門列表。

因為作廢后要還是要回到部門列表頁,所以干脆就將作廢功能放在 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>&nbsp;</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條記錄,如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM