C#之MVC:初學者之非常基礎的遞歸單表

序言

您好! 這是我第一次發表文章。閒話少敘,在我踏上學習C#這條一路以後,作爲一名新手,作爲女生,不後悔。我的技術水平目前約爲一渣渣,各位您請批評指教。如有興趣,可閱讀本篇文章,大略瞭解一下我的第一天記錄。

開始

☆工具說明:
數據庫:Microsoft SQL Server Management Studio 17
編碼:啓動 Visual Studio 2017 的實驗實例
MVC
ADO

1數據表

 ## 1.1分類表

在這裏插入圖片描述

create table ProductClass–商品分類表
(
ClassID int constraint ProductClass_PK primary key identity(1,1),–主鍵,自增,商品分類ID
ClassName nvarchar(50) not null,–分類名稱
ParentID int default 0 not null,–父分類ID
ParentPath nvarchar(500) not null–分類路徑
)

## 1.2插入數據

insert into ProductClass(ClassName,ParentID,ParentPath) values(‘權限設置’,0,‘0’),(‘角色管理’,1,‘0,1’),(‘角色管理’,2,‘0,1,2’),(‘角色添加’,2,‘0,1,2’),(‘角色添加’,2,‘0,1,2’),(‘角色修改’,2,‘0,1,2’),(‘角色刪除’,2,‘0,1,2’),(‘角色查詢’,2,‘0,1,2’),(‘用戶管理’,1,‘0,2’),(用戶管理,9,‘0,2,9’),
(用戶添加,9,‘0,2,9’),(用戶修改,9,‘0,2,9’),(用戶刪除,9,‘0,2,9’),(日誌管理,1,‘0,3’),(日誌存儲,14,‘0,3,14’),(日誌銷燬,14,‘0,3,14’)……

select count(*) from ProductClass
select * from ProductClass

2.VS Code

## 2.1 Model  模型

public class ProductClass
{
public int ClassID { get; set; }
public string ClassName { get; set; }
public int ParentID { get; set; }
public string ParentPath { get; set; }
}

## 2.2 Controller   控制器

引用一下相應的名稱空間,開始寫代碼(CRUD)

//數據庫連接字符串
 string str = "Data Source=.;Initial Catalog=Vocation;Integrated Security=True";
 //實例化
 List<ProductClass> clist = new List<ProductClass>();
 
       //視圖
        public ActionResult Index()
        {
            GetClass(1);
            return View(clist);
        }

        //構造函數:初始化數據
        public ProductsController()
        {
            using (SqlConnection conn = new SqlConnection(str))
            {
                SqlDataAdapter sdr = new SqlDataAdapter("SELECT * FROM ProductClass WHERE ParentID=0", conn);
                DataTable dt = new DataTable();
                sdr.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    clist.Add(new ProductClass { ClassID = (int)dr["ClassID"], ClassName = dr["ClassName"].ToString(), ParentID = (int)dr["ParentID"], ParentPath = dr["ParentPath"].ToString() });
                    GetClass((int)dr["ClassID"]);
                }
            }
        }
        //獲取類型信息
        public void GetClass(int pid)
        {
            using (SqlConnection conn=new SqlConnection(str))
            {
                string str = string.Format("SELECT * FROM ProductClass WHERE ParentID={0}", pid);
                SqlCommand cmd = new SqlCommand(str, conn);
                cmd.Parameters.AddWithValue("@ParentID", pid);
                SqlDataAdapter sdr = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                sdr.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    clist.Add(new ProductClass {  ClassID=(int)dr["ClassID"] , ClassName=dr["ClassName"].ToString(), ParentID=(int)dr["ParentID"], ParentPath=dr["ParentPath"].ToString() });
                    GetClass((int)dr["ClassID"]);
                }
            }
        }

            //刪除
        public int DelClass(int cid)
        {
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                string str = string.Format("DELETE FROM ProductClass WHERE ClassID={0}",cid);
                SqlCommand cmd = new SqlCommand(str, conn);
                return cmd.ExecuteNonQuery();
            }
        }
        
           //添加或修改
        public int AddOrUpdClass(ProductClass pc)
        {
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                string str = "";
                if (pc.ClassID>0)
                {
                    str = string.Format("UPDATE ProductClass SET ClassName='{0}',ParentID={1},ParentPath='{2}'", pc.ClassName,pc.ParentID,pc.ParentPath);
                }
                else
                {
                    str = string.Format("INSERT INTO ProductClass VALUES('{0}',{1},'{2}')",pc.ClassName,pc.ParentID,pc.ParentPath);
                }
                SqlCommand cmd = new SqlCommand(str, conn);
                return cmd.ExecuteNonQuery();
            }
        }

           //反填
        public ActionResult GetClassById(int id)
        {
            using (SqlConnection conn = new SqlConnection(str))
            {
                string str = string.Format("SELECT * FROM ProductClass WHERE ClassID={0}", id);
                DataTable dt = new DataTable();
                SqlDataAdapter sdr = new SqlDataAdapter();
                sdr.Fill(dt);
                ProductClass pmode = new ProductClass();
                pmode = JsonConvert.DeserializeObject<List<ProductClass>>(JsonConvert.SerializeObject(dt)).First();
                return Json(pmode,JsonRequestBehavior.AllowGet);
            }
        }
 ## 2.3 View 視圖

根據Action渲染View, 只附上顯示的視圖

@model IEnumerable<ProductsPlanLibingyang.Models.ProductClass>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>

@foreach (var p in Model)
{
    if (p.ParentID != 0)
    {
        string str = string.Empty;
        int level = p.ParentPath.Split(',').Length;
        for (int i = 0; i < level; i++)
        {
            str += "&nbsp;&nbsp;";
        }
        @Html.Raw(str+ "|—")
    }
    @p.ClassName<br />
}

運行效果附上:

在這裏插入圖片描述
如圖所示

3.彙總 :

主要是遞歸的思想一定要把握!
但我發現:呀嘿, 難道是 我的 子節點數據 重複加載了?
調整了一下:
還是好奇怪。
在這裏插入圖片描述

##有始有終:目前只是出於學習狀態,也只是記錄一下自己所學的東西。畢竟咱不是大神,一直在努力,對自己說一聲:加油吧!

無力吐槽了,歇一會兒吧。。。

在這裏插入圖片描述
如有機會,下次再記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章