小白开学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上查看。

小白开学Asp.Net Core 《九》相关推荐

  1. 小白开学Asp.Net Core 《五》

    小白开学Asp.Net Core<五>                               -- 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...

  2. 小白开学Asp.Net Core 《十》

    小白开学Asp.Net Core <十> - - Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...

  3. 小白开学Asp.Net Core 《八》

    小白开学Asp.Net Core <八> - - .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...

  4. 小白开学Asp.Net Core 《七》

    小白开学Asp.Net Core <七> - - 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...

  5. 小白开学Asp.Net Core《四》 —— 使用AspectCore-Framework

    小白开学Asp.Net Core<四>                               -- 使用AspectCore-Framework 一.AspectCore-Frame ...

  6. 小白开学Asp.Net Core 《六》 —— 探究.Net Core 跨平台的奥秘

    1.写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://github.com/AjuPrince/Aju.Carefree)也有好多人都希望我能写一些简单的入 ...

  7. 前端小白在asp.net core mvc中使用ECharts

    对于在浏览器中绘制图形图表,目前有较多的js类库可以使用,如:ChartJS,Flot,canvasjs等,但是今天介绍的主角为国产图表库,并在apache孵化,就是大名鼎鼎的echarts. 前方高 ...

  8. ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路

    一.前言  最近一段时间自己主要的学习计划还是按照毕业后设定的计划,自己一步步的搭建一个前后端分离的 ASP.NET Core 项目,目前也还在继续学习 Vue 中,虽然中间断了很长时间,好歹还是坚持 ...

  9. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

最新文章

  1. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)
  2. 网站留言板防重复留言_如何做一个2000年风格复古的个人网站(3)创建个人小站-主页...
  3. 6.extern “c”
  4. 寄存器在哪里_二、汇编之寄存器
  5. Oracle触发器详细介绍
  6. 华为云平台创建产品+注册设备
  7. 开课吧:MySQL索引的使用知识有哪些?
  8. 开发rtmp直播流测试地址
  9. passcode - pwnable
  10. Python程序员的就业方向及就业薪资,你都了解吗?
  11. 《国际经济学(商学院)》
  12. JavaWeb之页面跳转数据库连接
  13. 酷狗音乐9.2.0_酷狗音乐安卓版 v9.2.0下载 - 艾薇下载站
  14. Linux配置及指令
  15. iOS安全攻与防(总篇)
  16. APACHE+PHP+MySQL 绿色版安装教程
  17. 独家:沪上三大律师解读“三驾马车”下的数据合规与上海数商体系创新​
  18. 分布式事务前看懂CAP、BASE
  19. CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)
  20. Oracle产品服务和技术级别的介绍

热门文章

  1. 本地服务器下的局域网安全吗_本地安全认证服务器
  2. 控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法
  3. python测试框架数据生成工具最全资源汇总
  4. 聊聊storm nimbus的LeaderElector
  5. jsonp-反向代理-CORS解决JS跨域问题的个人总结
  6. exchange2013 owa-outlook界面语言
  7. 7 种 JavaScript 技巧使你更聪明
  8. 微信支付四大支付模式分别有哪些区别?
  9. MinGW安装和使用基础教程
  10. C#学习笔记——通用对话框