小白開學Asp.Net Core 《九》

来源:https://www.cnblogs.com/haoxiaozhang/archive/2019/07/23/11232276.html
-Advertisement-
Play Games

小白開學Asp.Net Core 《九》 — — 前端篇(不務正業) 在《小白開學Asp.Net Core 三》中使用了X-admin 2.x 和 Layui將管理後端的界面重新佈局了,裡面簡單的介紹了layui table 的使用以及頁面table所需的數據做了簡單的封裝。今天擴展學習下。 一、L ...


小白開學Asp.Net Core 《九》 

      — — 前端篇(不務正業)

  在《小白開學Asp.Net Core 三》中使用了X-admin 2.x 和 Layui將管理後端的界面重新佈局了,裡面簡單的介紹了layui table 的使用以及頁面table所需的數據做了簡單的封裝。今天擴展學習下。

一、Layui 第三方組件的使用

  1)、下載安裝位置

  在layui官方提供的模塊滿足不了我們的時候,我們可以在layui 第三方組件平臺上尋找我們所需的組件來滿足我們的需求,我們將找見的模塊下載下來後放在統一的地方,如下圖所示:

 

   在本項目中我將放在了上圖所示的地方。

  目前在此項目中用到了authtree、treeSelect和treetable三個第三方組件。

  2)全局配置(官方)

//config的設置是全局的
layui.config({
  base: '/res/js/' //假設這是你存放拓展模塊的根目錄
}).extend({ //設定模塊別名
  mymod: 'mymod' //如果 mymod.js 是在根目錄,也可以不用設定別名
  ,mod1: 'admin/mod1' //相對於上述 base 目錄的子目錄
});
 
//你也可以忽略 base 設定的根目錄,直接在 extend 指定路徑(主要:該功能為 layui 2.2.0 新增)
layui.extend({
  mod2: '{/}http://cdn.xxx.com/lib/mod2' // {/}的意思即代表採用自有路徑,即不跟隨 base 路徑
})
 
//使用拓展模塊
layui.use(['mymod', 'mod1'], function(){
  var mymod = layui.mymod
  ,mod1 = layui.mod1
  ,mod2 = layui.mod2;
  
  mymod.hello('World!'); //彈出 Hello World!
});

二、前後結合使用

  1)定義前端展示所需的數據格式

using System.Collections.Generic;

namespace Aju.Carefree.Dto.ViewModel
{
    /// <summary>
    /// 前端頁面
    /// </summary>
    public class FrontPageBaseViewModel
    {
        /// <summary>
        /// 狀態碼
        /// </summary>
        public int code { get; set; } = 0;
        /// <summary>
        /// 操作消息
        /// </summary>
        public string msg { get; set; } = "操作成功";

        /// <summary>
        /// 數據內容
        /// </summary>
        public dynamic data { get; set; }
    }
    /// <summary>
    /// layer ui Table 數據返回格式
    /// </summary>
    #region layer ui Table
    public class TableDataModel : FrontPageBaseViewModel
    {
        /// <summary>
        /// 總記錄條數
        /// </summary>
        public int count { get; set; }
    }
    #endregion

    /// layui AuthTree 返回數據格式
    /// </summary>
    #region layui AuthTree 返回數據格式
    public class AuthTreeViewModel : FrontPageBaseViewModel
    {

    }
    public class AuthTreeViewModelExt
    {
        public List<AuthTreeViewModelList> trees { get; set; }
    }
    public class AuthTreeViewModelList
    {
        public string name { get; set; }
        public string value { get; set; }
        public bool @checked { get; set; }
        public List<AuthTreeViewModelList> list { get; set; }
    }
    #endregion

    /// <summary>
    /// Layui Tree 前端數據 ViewModel
    /// </summary>
    #region  Layui Tree 
    public class LayuiTreeViewModel
    {
        /// <summary>
        /// 節點標題
        /// </summary>
        public string title { get; set; }

        /// <summary>
        /// 節點唯一索引,用於對指定節點進行各類操作
        /// </summary>
        public string id { get; set; }
        /// <summary>
        /// 點擊節點彈出新視窗對應的 url。需開啟 isJump 參數
        /// </summary>
        public string href { get; set; }
        /// <summary>
        /// 節點是否初始展開,預設 false
        /// </summary>
        public bool spread { get; set; } = true;
        /// <summary>
        /// 節點是否初始為選中狀態(如果開啟覆選框的話),預設 false
        /// </summary>
        public bool @checked { get; set; } = false;

        /// <summary>
        /// 節點是否為禁用狀態。預設 false
        /// </summary>
        public bool disabled { get; set; } = false;

        public List<LayuiTreeViewModel> children { get; set; }
    }
    #endregion

    /// <summary>
    ///  Layui treeSelect 前端數據 ViewModel
    /// </summary>
    #region Layui treeSelect
    public class TreeSelectViewModel
    {
        public string id { get; set; }

        public string name { get; set; }

        public bool open { get; set; } = true;
        public bool @checked { get; set; } = false;

        public List<TreeSelectViewModel> children { get; set; }
    }
    #endregion

}

  2)、返回數據

   以Tree Select為例   

    服務實現層:

 public async Task<List<TreeSelectViewModel>> GetTreeSelectViewModel()
        {
            var viewModelList = new List<TreeSelectViewModel>();
            var list = await _repository.FindListByClauseAsync(s => s.EnabledMark == true && s.DeleteMark == false);
            list.Where(s => s.ParentId == "0").ToList().ForEach(item =>
            {
                var viewModel = new TreeSelectViewModel
                {
                    id = item.Id,
                    name = item.FullName
                };
                GetItemsEntityByParentId(item.Id, viewModel, list);
                viewModelList.Add(viewModel);
            });
            return viewModelList;
        }

        private TreeSelectViewModel GetItemsEntityByParentId(string parendId, TreeSelectViewModel viewModel, IEnumerable<ItemsEntity> list)
        {
            var items = list.Where(s => s.ParentId.Equals(parendId));
            if (!items.Any()) return null;
            List<TreeSelectViewModel> layuiTreeViewModelsList = new List<TreeSelectViewModel>();
            items.ToList().ForEach(item =>
            {
                TreeSelectViewModel layuiTreeViewModel = new TreeSelectViewModel
                {
                    id = item.Id,
                    name = item.FullName
                };
                GetItemsEntityByParentId(item.Id, layuiTreeViewModel, list);
                layuiTreeViewModelsList.Add(layuiTreeViewModel);
            });
            viewModel.children = layuiTreeViewModelsList;
            return viewModel;
        }

   Controller

 [HttpGet]
        public async Task<string> GetItemData()
        {
            var data = await _itemService.GetTreeSelectViewModel();
            return JsonHelper.Instance.Serialize(data);
        }

 3)、前端展示 

  html

 <div class="layui-input-block">
                    <input type="text" id="ParentId" name="ParentId" lay-filter="tree" required lay-verify="ParentId" lay-reqText="請選擇上級" class="layui-input">
                </div>

 封裝js

layui.config({ base: '/lib/extends/' }).extend({ treeSelect: 'treeSelect/treeSelect' });  //這是前面介紹的全局配置第三方組件
/*
 * @method AjuCarefree_TreeSelect
 * @desc TreeSelect
 */
AjuCarefree_TreeSelect = function (options)
{
    var defaults = {
        elem: null,
        dataUrl: '',
        type: 'get',
        placeholder: '預設提示信息',
        search: true,
        clickCall: null,
        nodeValue: null,
        elemExt: null
    };
    var options = extend(defaults, options);
    layui.use(['treeSelect', 'form'], function ()
    {
        var treeSelect = layui.treeSelect;

        treeSelect.render({
            // 選擇器
            elem: options.elem,
            // 數據
            data: options.dataUrl,
            // 非同步載入方式:get/post,預設get
            type: options.type,
            // 占位符
            placeholder: options.placeholder,
            // 是否開啟搜索功能:true/false,預設false
            search: options.search,
            style: {
                folder: { // 父節點圖標
                    enable: true // 是否開啟:true/false
                },
                line: { // 連接線
                    enable: true // 是否開啟:true/false
                }
            },
            // 點擊回調
            click: function (d)
            {
                // console.log(d);
                //console.log(d.treeId); // 得到組件的id
                //console.log(d.current.id); // 得到點擊節點的treeObj對象
                //console.log(d.data); // 得到組成樹的數據
                options.clickCall(d.current.id);
            },
            // 載入完成後的回調函數
            success: function (d)
            {
                if (options.nodeValue !== null && options.nodeValue !== undefined && options.nodeValue !== "") {
                    treeSelect.checkNode(options.elemExt, options.nodeValue);
                }
            }
        });
    });
};
/*
 * @method 函數用於將一個或多個對象的內容合併到目標對象
 * @desc 函數用於將一個或多個對象的內容合併到目標對象
 */
function extend()
{
    var length = arguments.length;
    var target = arguments[0] || {};
    if (typeof target !== "object" && typeof target !== "function") {
        target = {};
    }
    if (length === 1) {
        target = this;
        i--;
    }
    for (var i = 1; i < length; i++) {
        var source = arguments[i];
        for (var key in source) {
            // 使用for in會遍曆數組所有的可枚舉屬性,包括原型。
            if (Object.prototype.hasOwnProperty.call(source, key)) {
                target[key] = source[key];
            }
        }
    }
    return target;
}

     js 綁數據

 <script src="~/js/aju.Carefree.treeSelect.js"></script>
    <script>
    AjuCarefree_TreeSelect({
        elem: '#ParentId',
        dataUrl: '/Item/GetItemData',
        placeholder: '請選擇上級菜單',
        nodeValue: '@Model.Id',
        elemExt: 'tree',
        clickCall: function (d)
        {
            document.getElementById("ParentId").value = d;//將選中的值賦值給 ParentId
        }
    });
</script>

三、最終展示

(圖中圈中的就是今天演示的)

 

 今天就寫到這裡,如果有同學在使用layui時起到引導作用就可以說達到本篇寫作的目的了。如果還有其他疑問,可以加群交流。

說明:

  layui 文檔:(https://www.layui.com/doc/

  layui 第三方組件:(https://fly.layui.com/extend/

 其他的組件使用可以在github上查看。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹的Java規則的說明分為3個主要級別,中級是平時開發用的比較多的級別,在今後將陸續寫出其他的規則。遵守了這些規則可以提高程式的效率、使代碼又更好的可讀性等。 一、在finally方法里關掉input或者output資源 方法體裡面定義了input或者output流的話,需要在finally里 ...
  • T1 足球聯賽 題目 【題目描述】 巴蜀中學新一季的足球聯賽開幕了。足球聯賽有n只球隊參賽,每賽季,每隻球隊要與其他球隊各賽兩場,主客各一場,贏一場得3分,輸一場不得分,平局兩隻隊伍各得一分。 英勇無畏的小鴻是機房的主力前鋒,她總能在關鍵時刻踢出一些匪夷所思的妙球。但是很可惜,她過早的燃燒完了她的職 ...
  • hhh 為年薪20萬加油ヾ(◍°∇°◍)ノ゙ 一、變數:(變數的命名規則:一般使用字母開頭,可以使用下劃線連接,以及數字) 正確的變數命名示範: (儘量使用容易理解什麼用途的詞語) a1 name_Li name2 錯誤的變數示例: 1a a=1 print(a) b='年薪百萬不是夢' print ...
  • 一個可以沉迷於技術的程式猿,wx加入加入技術群:fsx641385712 ...
  • import os def file_handler(backend_data,res=None,type='fetch'): # 查詢功能 if type == 'fetch': with open('test_new.txt','r') as read_f: ret = [] ... ...
  • 介紹 使用函數式編程來豐富面向對象編程的想法是陳舊的。將函數編程功能添加到面向對象的語言中會帶來面向對象編程設計的好處。 一些舊的和不太老的語言,具有函數式編程和麵向對象的編程: 例如,Smalltalk和Common Lisp。 最近是Python或Ruby。 面向對象編程中模擬的函數式編程技術 ...
  • 1.背景 由於歷史原因,筆者所在的公司原有的ES查詢驅動採用的是 PlainElastic.Net, 經過詢問原來是之前PlainElastic.Net在園子里文檔較多,上手比較容易,所以最初作者選用了該驅動,而發佈也由於歷史原因都部署在 windows 伺服器上,基於 .NET Framework ...
  • 一、C#實現本地文件下載 1、文件下載的路徑 文件名稱 以及文件下載之後要放的位置 這三個變數是必須要的 2、定義以下四個對象: FileWebRequest ftpWebRequest = null; FileWebResponse ftpWebResponse = null; Stream ft ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...