篇(18)-Asp.Net Core入門實戰-文章管理之文章內容管理(下拉框二級結構遞歸)

来源:https://www.cnblogs.com/mushaobai/archive/2022/11/21/16911139.html
-Advertisement-
Play Games

一:背景 1.講故事 前段時間有位朋友找到我,說他的程式在客戶的機器上跑著跑著會出現偶發卡死,然後就崩掉了,但在本地怎麼也沒復現,dump也抓到了,讓我幫忙看下到底怎麼回事,其實崩潰類的dump也有簡單的,也有非常複雜的,因為大多情況下都是非托管層面出現的各種故障,非常考驗對 C, C++, Win ...


篇(18)-Asp.Net Core入門實戰-文章管理之文章內容管理(下拉框二級結構遞歸實現)

文章管理是CMS系統的核心表之一,存儲文章內容,特點就是欄位端,屬性多,比如是否標識為熱點、推薦等屬性,是否發佈,類別,SEO關鍵字等。我們本章講解文章內容的增刪改查。

(1).文章Sql表結構設計

CREATE TABLE [dbo].[Article](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CategoryId] [int] NOT NULL,
[Title] [varchar](128) NOT NULL,
[ImageUrl] [varchar](128) NULL,
[Content] [text] NULL,
[ViewCount] [int] NOT NULL,
[Sort] [int] NOT NULL,
[Author] [varchar](64) NULL,
[Source] [varchar](128) NULL,
[SeoTitle] [varchar](128) NULL,
[SeoKeyword] [varchar](256) NULL,
[SeoDescription] [varchar](512) NULL,
[AddManagerId] [int] NOT NULL,
[AddTime] [datetime] NOT NULL,
[ModifyManagerId] [int] NULL,
[ModifyTime] [datetime] NULL,
[IsTop] [bit] NOT NULL,
[IsSlide] [bit] NOT NULL,
[IsRed] [bit] NOT NULL,
[IsPublish] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
CONSTRAINT [PK_ARTICLE] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT (getdate()) FOR [AddTime]
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT ((0)) FOR [IsTop]
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT ((0)) FOR [IsSlide]
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT ((0)) FOR [IsRed]
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT ((0)) FOR [IsPublish]
GO
ALTER TABLE [dbo].[Article] ADD DEFAULT ((0)) FOR [IsDeleted]
GO
ALTER TABLE [dbo].[Article] WITH CHECK ADD CONSTRAINT [FK_ARTICLE_RELATIONS_ARTICLEC] FOREIGN KEY([CategoryId])
REFERENCES [dbo].[ArticleCategory] ([Id])
GO
ALTER TABLE [dbo].[Article] CHECK CONSTRAINT [FK_ARTICLE_RELATIONS_ARTICLEC]
GO

 

那麼對應的Article Model代碼如下:

public class Article
{
/// <summary>
/// 主鍵
/// </summary>
[Key]
public Int32 Id { get; set; }
/// <summary>
/// 分類ID
/// </summary>
[Required]
public Int32 CategoryId { get; set; }
/// <summary>
/// 文章標題
/// </summary>
[Required]
public String Title { get; set; }
/// <summary>
/// 圖片地址
/// </summary>
public String ImageUrl { get; set; }
/// <summary>
/// 文章內容
/// </summary>
public String Content { get; set; }
/// <summary>
/// 瀏覽次數
/// </summary>
[Required]
public Int32 ViewCount { get; set; }
/// <summary>
/// 排序
/// </summary>
[Required]
public Int32 Sort { get; set; }
/// <summary>
/// 作者
/// </summary>
public String Author { get; set; }
/// <summary>
/// 來源
/// </summary>
public String Source { get; set; }
/// <summary>
/// SEO標題
/// </summary>
public String SeoTitle { get; set; }
/// <summary>
/// SEO關鍵字
/// </summary>
public String SeoKeyword { get; set; }
/// <summary>
/// SEO描述
/// </summary>
public String SeoDescription { get; set; }
/// <summary>
/// 添加人ID
/// </summary>
[Required]
public Int32 AddManagerId { get; set; }
/// <summary>
/// 添加時間
/// </summary>
[Required]
public DateTime AddTime { get; set; }
/// <summary>
/// 修改人ID
/// </summary>
public Int32? ModifyManagerId { get; set; }
/// <summary>
/// 修改時間
/// </summary>
public DateTime? ModifyTime { get; set; }
/// <summary>
/// 是否置頂
/// </summary>
public Boolean IsTop { get; set; }
/// <summary>
/// 是否輪播顯示
/// </summary>
public Boolean IsSlide { get; set; }
/// <summary>
/// 是否熱門
/// </summary>
public Boolean IsRed { get; set; }
/// <summary>
/// 是否發佈
/// </summary>
public Boolean IsPublish { get; set; }
/// <summary>
/// 是否刪除
/// </summary>
[Required]
public Boolean IsDeleted { get; set; }
}

 

(2).視圖Create代碼

(2.1)視圖代碼

考慮到要同時上傳圖片,註意form表單的額 enctype類型;

@{ ViewData["Title"] = "新建文章"; }
@model Article
<form action="/Article/Create" method="post" enctype="multipart/form-data">
@Html.AntiForgeryToken()
<div>
<label asp-for="Title">標題</label>
<div>
<input type="text" asp-for="Title" name="Title" placeholder="請輸入標題">
</div>
</div>
<div>
<label asp-for="CategoryId">文章類型</label>
<div>
@Html.DropDownList("ddl_CategoryId", ViewBag.database as IEnumerable<SelectListItem>)
</div>
</div>
<div>
<label>設置</label>
<div>
@*@Html.CheckBox("IsTop") 置頂
@Html.CheckBox("IsRed") 熱點
@Html.CheckBox("IsSlide") 幻燈*@
<input type="checkbox" name="IsTop" asp-for="IsTop" />置頂
<input type="checkbox" name="IsRed" asp-for="IsRed"/>熱點
<input type="checkbox" name="IsSlide" asp-for="IsSlide" />幻燈
</div>
</div>
<div>
<label asp-for="ImageUrl">文章首頁圖</label>
<div>
<input type="file" asp-for="ImageUrl" name="ImageUrl"/>
</div>
</div>
<div>
<label asp-for="Content">內容</label>
<div>
<textarea placeholder="內容" asp-for="Content" name="Content" cols="30" rows="10"></textarea>
</div>
</div>
<div>
<label asp-for="Sort">排序</label>
<div>
<input type="text" placeholder="排序" asp-for="Sort" name="Sort" />
</div>
</div>
<div>
<label asp-for="ViewCount">點擊量</label>
<div>
<input type="text" placeholder="點擊量" asp-for="ViewCount" name="ViewCount" />
</div>
</div>
<div>
<label asp-for="IsPublish">是否發佈</label>
<div>
<select asp-for="IsPublish" name="IsPublish" class="IsPublish">
<option value="False"></option>
<option value="True" selected></option>
</select>
</div>
</div>
<div>
<label asp-for="Author">作者</label>
<div>
<input type="text" asp-for="Author" name="Author" placeholder="作者名">
</div>
</div>
<div>
<label asp-for="Source">來源</label>
<div>
<input type="text" asp-for="Source" name="Source" placeholder="文章來源">
</div>
</div>
<div>
<label asp-for="SeoTitle">SEO標題</label>
<div>
<input type="text" asp-for="SeoTitle" name="SeoTitle" placeholder="SEO標題">
</div>
</div>
<div>
<label asp-for="SeoKeyword">SEO關鍵詞</label>
<div>
<input type="text" asp-for="SeoKeyword" name="SeoKeyword" placeholder="SEO關鍵詞">
</div>
</div>
<div>
<label asp-for="SeoDescription">SEO摘要描述</label>
<div>
<input type="text" asp-for="SeoDescription" name="SeoDescription" placeholder="SEO摘要描述">
</div>
</div>
<div>
<div>
<button type="submit">確定</button>
<button type="reset">重置</button>
</div>
</div>
</form>

 

(2.2)視圖中的下拉框的實現方式(遞歸和迴圈嵌套)

我想在添加文章時,實現一個具有二級層次結構的下拉框,如上圖所示。所以,在對下拉框進行數據綁定時,就要費點功夫,上個章節講文章類別管理時,的表結構就一個,分類都存在一張表中,所以要進行遞歸的獲取子菜單或者通過迴圈嵌套來實現。

遞歸的主要核心函數為:

/// <summary>
/// 遞歸函數,實現獲取子菜單
/// </summary>
/// <param name="lists">遞歸前的列表</param>
/// <param name="newlists">遞歸後的新列表</param>
/// <param name="parentId">父Id</param>
/// <returns></returns>
public static List<CategorySelectItemListView> GetChildCategory(List<CategorySelectItemListView> lists, List<CategorySelectItemListView> newlists, int parentId)
{
newlists = new List<CategorySelectItemListView>();
List<CategorySelectItemListView> tempList = lists.Where(c => c.ParentId == parentId).ToList();
for (int i = 0; i < tempList.Count; i++)
{
CategorySelectItemListView category = new CategorySelectItemListView();
category.Id = tempList[i].Id;
category.ParentId = tempList[i].ParentId;
category.Title = tempList[i].Title;
category.Children = GetChildCategory(lists, newlists, category.Id);
newlists.Add(category);
}
return newlists;
}


/// <summary>
/// 迴圈嵌套,實現獲取子菜單
/// </summary>
/// <param name="lists">迴圈遍歷前的列表</param>
/// <returns></returns>
public static List<CategorySelectItemListView> GetChildCategory(List<CategorySelectItemListView> lists)
{
List<CategorySelectItemListView> categorylist = new List<CategorySelectItemListView>();
for (int i = 0; i < lists.Count; i++)
{
if (0 == lists[i].ParentId)
categorylist.Add(lists[i]);
for (int j = 0; j < lists.Count; j++)
{
if (lists[j].ParentId == lists[i].Id)
lists[i].Children.Add(lists[j]);
}
}
return categorylist;
}

 

然後在Create和Edit的Action中去綁定對應的下拉菜單即可。

註意:List<CategorySelectItemListView> 集合的CategorySelectItemListView,這個是新建的ViewModel對象,用來專門綁定下拉菜單使用,其代碼如下:

public class CategorySelectItemListView
{
public int Id { get; set; }
public string Title { get; 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、快速開始 1.1、現有一張 User 表,其表結構如下 | id | name | age | emali | | | | | | | 1 | Jone | 18 | [email protected] | | 2 | Jack | 20 | [email protected] | | 3 ...
  • 在JSP頁面實現驗證碼校驗文章中當時是使用的Servlet類來進行的驗證碼校驗,但是這種方式並不能即時校驗,在正常情況下都是直接在用戶輸入之後就進行校驗,這樣對用戶來說很方便的。 AJAX 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML) ...
  • 抽象類:可以作為頂層基類,從高層次規範編程介面 1、在abc模塊中,最常見的抽象類有Iterable,我們可以用他判斷一個對象是不是可迭代對象 1 from collections.abc import Iterable 2 3 4 class Valley: 5 6 def __iter__(se ...
  • 流程式控制制主要作用於:用來判斷某個程式在不同條件下,執行不同邏輯。 按結構分類,流程式控制制可分為:順序結構、選擇結構、迴圈結構 順序結構:程式從上往下執行 選擇結構:根據程式在不同條件下,選擇執行不同的邏輯代碼 迴圈結構:在一定的條件下,重覆執行某段代碼 選擇結構 java選擇結構的語句有:if語句 i ...
  • 虛擬機 1.1 發展歷程 1.1.1 java往事 ​ Java誕生在一群懶惰、急躁而傲慢的程式天才之中。 ​ 1990年12月,Sun的工程師Patrick Naughton被當時糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,並威脅要離開Sun轉投當時在Steve Jobs領導之下的NeXT公 ...
  • 1、流式查詢 1、實體類 package com.wanqi.pojo; import java.util.Date; /** * @Description TODO * @Version 1.0.0 * @Date 2022/9/12 * @Author wandaren */ public cl ...
  • 最近在學習fastdfs時遇到了一個困擾我數小時的問題,結果很感人,特在此記錄下來,也是為了讓其他小伙伴們避坑 (這裡我的fastdfs運行環境是在docker中) 事情是這樣的,用APIfox測試fastdfs文件上傳的時候發現明明返回的成功的結果但是在瀏覽器中使用路徑卻訪問不到伺服器上的圖片,瀏 ...
  • NET 6 環境開發 實現 線程數量,任務隊列,非核心線程,及核心線程活躍時間的管理。 namespace CustomThreadPool; /// <summary> /// 線程池類 /// </summary> public class ThreadPoolExecutor { /// <s ...
一周排行
    -Advertisement-
    Play Games
  • 背景 在瀏覽器中訪問本地靜態資源html網頁時,可能會遇到跨域問題如圖。 是因為瀏覽器預設啟用了同源策略,即只允許載入與當前網頁具有相同源(協議、功能變數名稱和埠)的內容。 WebView2預設情況下啟用了瀏覽器的同源策略,即只允許載入與主機相同源的內容。所以如果我們把靜態資源發佈到iis或者通過node ...
  • 最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那麼 1=1 存在什麼樣的問題呢?為什麼又會使用呢? ...
  • 好久不見,我又回來了。 給大家分享一個我最近使用c#代碼操作ftp伺服器的代碼示例: 1 public abstract class FtpOperation 2 { 3 /// <summary> 4 /// FTP伺服器地址 5 /// </summary> 6 private string f ...
  • 一:背景 1. 講故事 過年喝了不少酒,腦子不靈光了,停了將近一個月沒寫博客,今天就當新年開工寫一篇吧。 去年年初有位朋友找到我,說他們的系統會偶發性崩潰,在網上也發了不少帖子求助,沒找到自己滿意的答案,讓我看看有沒有什麼線索,看樣子這是一個牛皮蘚的問題,既然對方有了dump,那就分析起來吧。 二: ...
  • 自己製作的一個基於Entity Framework Core 的資料庫操作攔截器,可以列印資料庫執行sql,方便開發調試,代碼如下: /// <summary> /// EF Core 的資料庫操作攔截器,用於在資料庫操作過程中進行日誌記錄和監視。 /// </summary> /// <remar ...
  • 本文分享自華為雲社區《Go併發範式 流水線和優雅退出 Pipeline 與 Cancellation》,作者:張儉。 介紹 Go 的併發原語可以輕鬆構建流數據管道,從而高效利用 I/O 和多個 CPU。 本文展示了此類pipelines的示例,強調了操作失敗時出現的細微之處,並介紹了乾凈地處理失敗的 ...
  • 在上篇文章中,我們介紹到在多線程環境下,如果編程不當,可能會出現程式運行結果混亂的問題。出現這個原因主要是,JMM 中主記憶體和線程工作記憶體的數據不一致,以及多個線程執行時無序,共同導致的結果。 ...
  • 1、下載安裝包首先、進入官網下載安裝包網址:https://www.python.org/downloads/windows/下載步驟:進入下載地址,根據自己的電腦系統選擇相應的python版本 選擇適配64位操作系統的版本(查看自己的電腦操作系統版本), 點擊下載安裝包 也可以下載我百度雲分享的安 ...
  • 簡介 git-commit-id-maven-plugin 是一個maven 插件,用來在打包的時候將git-commit 信息打進jar中。 這樣做的好處是可以將發佈的某版本和對應的代碼關聯起來,方便查閱和線上項目的維護。至於它的作用,用官方說法,這個功能對於大型分散式項目來說是無價的。 功能 你 ...
  • 序言 在數字時代,圖像生成技術正日益成為人工智慧領域的熱點。 本討論將重點聚焦於兩個備受矚目的模型:DALL-E和其他主流AI繪圖方法。 我們將探討它們的優勢、局限性以及未來的發展方向。通過比較分析,我們期望能夠更全面地瞭解這些技術,為未來的研究和應用提供啟示。 Q: 介紹一下 dall-e Ope ...