因为每次给layui数据表格绑定数据或者类似操作的时候  总要重新做一遍 而且忘记很多东西 所以干脆写博客把相关东西记录下来 便于查阅和修正

以下是一个完整的数据表格i项目的增删改查案例

先来看后台

LayuiContext db = new LayuiContext();
Result res = null;

#region 分页查询/查询参数为姓名/性别/班级 利用if添加判断条件
[HttpGet]
public IHttpActionResult StudentList2(int page, int limit, string stuName, int? sex, int? classId)
{
var list = from s in db.Studnt
where s.Status == 1
join c in db.Classes on s.ClassId equals c.Id
where c.Status == 1
select new { s.Id, s.Name, s.Sex,s.Age, s.ClassId, s.CreateDate, className = c.Name };
if (!string.IsNullOrEmpty(stuName))
{
list = list.Where(x=>x.Name.Contains(stuName));
}
if (sex != null)
{
list = list.Where(x => x.Sex == sex);
}
if (classId != null)
{
list = list.Where(x => x.ClassId == classId);
}
var total = list.Count();
list = list.OrderByDescending(x => x.Id).Skip((page - 1) * limit).Take(limit);

ArrayList arrayList = new ArrayList();
foreach (var item in list)
{

arrayList.Add(new { item.Id, item.Name, item.Age, Sex = item.Sex == 1 ? "男" : "女", SexType = item.Sex, item.ClassId, CreateDate = item.CreateDate.ToString("yyyy-MM-dd"), item.className });
}

return Json(new { code = 0, msg = "", count = total, data = arrayList });
}
#endregion

#region 分页查询/查询参数为姓名/性别/班级 利用expression添加判断条件
[HttpGet]
public IHttpActionResult StudentList(int page, int limit, string stuName, int? sex, int? classId)
{
List<Expression<Func<StudentModel, bool>>> wheres = new List<Expression<Func<StudentModel, bool>>>();
if (!string.IsNullOrEmpty(stuName))
{
wheres.Add(x => x.Name.Contains(stuName));
}
if (sex != null)
{
wheres.Add(x => x.Sex == sex);
}
if (classId != null)
{
wheres.Add(x => x.ClassId == classId);
}
var list = from s in db.Studnt
where s.Status == 1
join c in db.Classes on s.ClassId equals c.Id
where c.Status == 1
select new StudentModel() { Id=s.Id,Name=s.Name,Sex=s.Sex,Age=s.Age,ClassId=s.ClassId,CreateDate=s.CreateDate, className=c.Name};
if (wheres.Count > 0)
{
foreach (var item in wheres)
{
list = list.Where(item);
}
}
var total = list.Count();
list = list.OrderByDescending(x => x.Id).Skip((page - 1) * limit).Take(limit);

ArrayList arrayList = new ArrayList();
foreach (var item in list)
{

arrayList.Add(new { item.Id, item.Name, item.Age, Sex = item.Sex == 1 ? "男" : "女", SexType = item.Sex, item.ClassId, CreateDate = item.CreateDate.ToString("yyyy-MM-dd"), item.className });
}

return Json(new { code = 0, msg = "", count = total, data = arrayList });
}
#endregion

#region 删除学生
[HttpGet]
public IHttpActionResult DeleteStu(int id)
{
try
{
if (id <= 0)
{
throw new Exception("id不正确");
}
var stu = db.Studnt.Find(id);
stu.Status = 5;
db.SaveChanges();
res = new Result { code = 200, msg = "学生删除成功" };
}
catch (Exception ex)
{
res = new Result { code = 0, msg = ex.Message };
}
return Json(res);
}
#endregion

#region 修改学生第一种方法 字段一个一个传入
[HttpPost]
public IHttpActionResult UpdateStu1(int id, string name, byte age, int classId, byte sex)
{
try
{
if (id <= 0)
{
throw new Exception("id不正确");
}
var stu = db.Studnt.Find(id);
stu.Name = name;
stu.Age = age;
stu.ClassId = classId;
stu.Sex = sex;
db.SaveChanges();
res = new Result { code = 200, msg = "学生修改成功" };
}
catch (Exception ex)
{
res = new Result { code = 0, msg = ex.Message };
}
return Json(res);
}
#endregion

#region 修改学生第二种方法 直接传入学生实体
[HttpPost]
public IHttpActionResult UpdateStu(Student model)
{
try
{
if (model.Id <= 0)
{
throw new Exception("传入实体的id有误");
}
var stu = db.Studnt.Find(model.Id);
stu.Name = model.Name;
stu.Age = model.Age;
stu.ClassId = model.ClassId;
stu.Sex = model.Sex;
db.SaveChanges();
res = new Result { code = 200, msg = "学生修改成功" };
}
catch (Exception ex)
{
res = new Result { code = 0, msg = ex.Message };
}
return Json(res);
}
#endregion

#region 新增学生
[HttpPost]
public IHttpActionResult AddStu(Student model)
{
try
{
model.Status = 1;
model.Sort = 2;
model.CreateDate = DateTime.Now;
db.Studnt.Add(model);
db.SaveChanges();
res = new Result { code = 200, msg = "学生新增成功" };
}
catch (Exception ex)
{
res = new Result { code = 0, msg = ex.Message };
}
return Json(res);
}
#endregion

#region 返回班级id和名称
[HttpGet]
public IHttpActionResult ClassList()
{
var query = from c in db.Classes
select new DropTemplate { id = c.Id, name = c.Name };
return Ok(query);
}
#endregion

这是整个后台的代码  

  这其中StudentList2方法 就是查询接口 layui的table.render方法或调用这个接口来给表格绑定数据  后面string stuName, int? sex, int? classId 这三个参数是查询时用到的参数 。

StudentList 也是一个查询接口 这里做两个接口的原因是StudentList2使用的是if判断后直接在list上添加where条件 而在StudentList中时使用了 List<Expression<Func<StudentModel, bool>>> wheres = new List<Expression<Func<StudentModel, bool>>>();这个东西来添加where条件实现的思路相同但是方法不同。这里记录一下将来也许会用到这个模式。这里要注意的是 如果使用Expression 那么这里的类型必须要和返回的list类型相同 因为学生关联了班级 所以这里需要新加一个和数据库无关的实体类  最后表连接查询得到的数据也应该构造称为新类型StudentModel。

  DeleteStu是删除接口,传入一个id值。我在数据库中用status=5代表数据为删除项。所以这里其实是执行update。不过这里虽然update成功了。

但是

var stu = db.Studnt.Find(id);
stu.Status = 5;
db.SaveChanges();

在我的记忆中 ef是有update方法的啊 我这里根本没有用就给更新成功了 我也不懂为什么。

  接下来是UpdateStu和AddStu 修改和新增 传入的是model实体,实现相应功能 很简单没什么要记录的

  接下来是ClassList接口 这个接口是为了给班级下拉框返回数据用的 这里我定义了一个模型类DropTemplate  代码如下:

  

[HttpGet]
public IHttpActionResult ClassList()
{
var query = from c in db.Classes
select new DropTemplate { id = c.Id, name = c.Name };
return Ok(query);
}

这样做的目的是统一所有的下拉框的接口返回都为select new { id = c.Id, name = c.Name } 这样的类型 前台就可以直接封装方法给下拉框绑定数据。到这里我突然发现模型类DropTemplate并没有什么用直接返回匿名类型就可以 只要匿名类组成一致就行 没必要新建类。但理论上为了统一标准 防止忘记 写上也没什么关系

  至此,后台接口已经介绍完毕 下面来看一下 前台的页面

@{
Layout = null;
}

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/layui/layui.js"></script>
<link href="~/layui/css/layui.css" rel="stylesheet" />
<script src="~/Scripts/jquery-3.3.1.js"></script>
<style>
#main .table, #search {
padding: 20px;
}

/*设置下拉框的背景颜色为蓝色*/

.layui-form-select dl dd.layui-this {
background-color: #1E9FFF;
}

/*防止下拉框弹层被遮住*/
.layui-layer-page .layui-layer-content {
position: relative;
overflow: visible !important;
}
</style>
</head>
<body>
<div id="search">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" id="btnAdd">新增</button>
</div>
</div>
<form class="layui-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">姓名</label>
<div class="layui-input-inline">
<input name="name" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-inline">
<select name="sex">
<option value=""></option>
<option value="1">男</option>
<option value="2">女</option>

</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">班级</label>
<div class="layui-input-inline">
<select name="className" id="stuClassName">
<option value=""></option>
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button type="button" class="layui-btn layui-btn-normal" id="btnSearch">查询</button>
<button id="btnReset" type="reset" class="layui-btn layui-btn-normal">重置</button>
</div>
</div>
</form>
</div>

<div id="main" style="margin:0 auto;">
<div class="table">
<table id="stuTable" lay-filter="test"></table>
</div>
</div>

@*分部视图(添加div)*@
@Html.Partial("/Views/Home/Add.cshtml")

@*分部视图(编辑div)*@
@Html.Partial("/Views/Home/Edit.cshtml")

<script type="text/html" id="barDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="update">编辑</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="delete">删除</button>
</div>
</script>

<script>
layui.use(['table', 'form'], function () {
var table = layui.table, form = layui.form;
//获取表格数据的接口
var tableurl = "/api/HomeApi/StudentList";
//添加数据接口
var addurl = "/api/HomeApi/AddStu";
//删除数据接口
var deleteurl = "/api/HomeApi/DeleteStu";
//修改数据接口
var editurl = "/api/HomeApi/UpdateStu";

//表格数据初始绑定
table.render({
elem: '#stuTable'
, url: tableurl
, where: { stuName: '', sex: '', classId: '' }
, page: { theme: '#1E9FFF' }
, cols: [[
{ field: 'Id', align: 'center', title: '编号' },
{ field: 'Name', align: 'center', title: '姓名' },
{ field: 'Age', align: 'center', title: '年龄' },
{ field: 'Sex', align: 'center', title: '性别' },
{ field: 'className', align: 'center', title: '班级' },
{ field: 'CreateDate', align: 'center', title: '创建日期' },
{ title: '操作', fixed: 'right', align: 'center', toolbar: '#barDemo' }
]]
});

//表格工具条事件
table.on('tool(test)', function (obj) {
var data = obj.data; //获得当前行数据
var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)

if (layEvent === 'update') { //查看
$("#EditForm input[name='name']").val(data.Name);
$("#EditForm input[name='age']").val(data.Age);
$("#EditForm select[name='sex']").val(data.SexType);
$("#EditForm select[name='className']").val(data.ClassId);
form.render('select');
layer.open({
type: 1,
area: ['860px', '360px'],
content: $('#EditForm'),
btn: ['保存', '取消'],
yes: function (index, layero) {
var Name = $("#EditForm input[name='name']").val();
var Age = $("#EditForm input[name='age']").val();
var Sex = $("#EditForm select[name='sex']").val();
var ClassId = $("#stuEditClassName").val();
if (CheckAddForm(Name, Age, Sex, ClassId)) {
var d = {"Id":data.Id, "Name": Name, "Age": parseInt(Age), "ClassId": parseInt(ClassId), "Sex": parseInt(Sex)};
Save(d, editurl);
} else {
return false;
}
}
});
} else if (layEvent === 'delete') { //删除
layer.confirm('确定删除?', function (index) {
Delete(data.Id);
layer.close(index);
});
}
});

//班级下拉框绑定数据
InitDropList('/api/HomeApi/ClassList', $("select[name='className']"));

//点击查询按钮时表格重载
$("#btnSearch").click(function () {
ShowSearchResult();
});

//点击重置按钮时表格重载
$("#btnReset").click(function () {
var obj = { stuName: "", sex: "", classId: "" };
ReloadTable("stuTable", obj);
});

//点击新增按钮时弹出分部视图
$("#btnAdd").click(function () {
InitAddForm();
layer.open({
type: 1,
area: ['860px', '360px'],
content: $('#addForm'),
btn: ['保存', '取消'],
yes: function () {
var Name = $("#addForm input[name='name']").val();
var Age = $("#addForm input[name='age']").val();
var Sex = $("#addForm select[name='sex']").val();
var ClassId = $("#stuAddClassName").val();
if (CheckAddForm(Name, Age, Sex, ClassId)) {
var data = { "Name": Name, "Age": parseInt(Age), "ClassId": parseInt(ClassId), "Sex": parseInt(Sex), "Status": 1 };
Save(data, addurl);
} else {
return false;
}
}
});
})

/****自定义JS函数*****/

//封装表格重载函数
function ReloadTable(tableId, obj) {
table.reload(tableId, {
url: tableurl
, where: obj
});
}

//初始化layui下拉框函数
function InitDropList(url, obj) {
$.ajax({
url: url,
dataType: 'json',
type: 'get',
success: function (data) {
$.each(data, function (index, item) {
obj.append(new Option(item.name, item.id));// 下拉菜单里添加元素
});
layui.form.render("select");
}
})
}

//添加表单初始化(除去上次添加留下的文本)
function InitAddForm() {
$("#addForm input[name='name']").val("");
$("#addForm input[name='age']").val("");
$("#addForm select[name='sex']").val("");
$("#addForm select[name='className']").val("");
form.render('select');
}

//保存方法(传入实体数据 保存数据 提示操作结果信息)
function Save(model, url) {
$.ajax({
url: url,
contentType: 'application/json',
type: 'post',
data: JSON.stringify(model),
success: function (res) {
if (res.code == 200) {
ShowSearchResult();
layer.closeAll();
layer.msg(res.msg, { icon: 1 });
}
else {
layer.msg("操作失败,请联系管理员!", { icon: 2 });
console.log(res.msg);
}
}
});
}

//根据查询条件显示表格
function ShowSearchResult() {
var name = $("#search input[name='name']").val();
var sex = $("#search select[name='sex']").val();
var classId = $("#stuClassName").val();
var obj = { stuName: name, sex: sex, classId: classId };
ReloadTable("stuTable", obj);
}

//添加表单的格式验证
function CheckAddForm(Name, Age, Sex, ClassId) {
if (Name == "" || Name == null) {
layer.msg("请填写姓名", { icon: 0 });
return false;
}
if (Age == "" || Age == null) {
layer.msg("请填写年龄", { icon: 0 });
return false;
}
if (isNaN(Age)) {
layer.msg("年龄必须为数字", { icon: 0 });
return false;
}
if (Sex == "" || Sex == null) {
layer.msg("请选择性别", { icon: 0 });
return false;
}
if (ClassId == "" || ClassId == null) {
layer.msg("请选择班级", { icon: 0 });
return false;
}
return true;
}

//删除数据
function Delete(id) {
$.ajax({
url: deleteurl,
data: { "id": id },
type: "get",
success: function (data) {
if (data.code == 200) {
layer.msg("删除成功");
ShowSearchResult();
} else {
layer.msg("删除失败,请联系管理员!");
console.log(data.msg);
}

}
});
}

/****自定义JS函数*****/

});
</script>
</body>
</html>

前台页面代码如上  在这里面有两个分部视图 

@*分部视图(添加div)*@
@Html.Partial("/Views/Home/Add.cshtml")

@*分部视图(编辑div)*@
@Html.Partial("/Views/Home/Edit.cshtml")

其实就是添加和修改的div,在这里首先声明好需要用到的所有接口

//获取表格数据的接口
var tableurl = "/api/HomeApi/StudentList";
//添加数据接口
var addurl = "/api/HomeApi/AddStu";
//删除数据接口
var deleteurl = "/api/HomeApi/DeleteStu";
//修改数据接口
var editurl = "/api/HomeApi/UpdateStu";

然后开始layui数据表格的数据绑定

//表格数据初始绑定
table.render({
elem: '#stuTable'
, url: tableurl
, where: { stuName: '', sex: '', classId: '' }
, page: { theme: '#1E9FFF' }
, cols: [[
{ field: 'Id', align: 'center', title: '编号' },
{ field: 'Name', align: 'center', title: '姓名' },
{ field: 'Age', align: 'center', title: '年龄' },
{ field: 'Sex', align: 'center', title: '性别' },
{ field: 'className', align: 'center', title: '班级' },
{ field: 'CreateDate', align: 'center', title: '创建日期' },
{ title: '操作', fixed: 'right', align: 'center', toolbar: '#barDemo' }
]]
});

然后开始layui数据表格的数据绑定  这里where是除了limit和page之外的参数 代表当前是不带有条件的  全部显示就行了

这里所有的前台js代码都写得有注释 接下来上传文件到gitee  以后有问题就直接看代码来做 省心很多

这里还有提一个今天遇到的坑  在form里面的button  今天没有加type属性 当我点击他的时候总是会刷新整个页面 这是因为如果type属性没有写,那么默认为submit  所以会刷新整个页面

 两个分部视图的代码如下

<form class="layui-form">
<div id="EditForm" style="display:none; padding:20px;">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">姓名</label>
<div class="layui-input-inline">
<input name="name" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-inline">
<input name="age" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-inline">
<select name="sex">
<option value=""></option>
<option value="1">男</option>
<option value="2">女</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">班级</label>
<div class="layui-input-inline">
<select name="className" id="stuEditClassName">
<option value=""></option>
</select>
</div>
</div>
</div>
</div>
</form>

<form class="layui-form">
<div id="addForm" style="display:none; padding:20px;">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">姓名</label>
<div class="layui-input-inline">
<input name="name" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">年龄</label>
<div class="layui-input-inline">
<input name="age" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">性别</label>
<div class="layui-input-inline">
<select name="sex">
<option value=""></option>
<option value="1">男</option>
<option value="2">女</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">班级</label>
<div class="layui-input-inline">
<select name="className" id="stuAddClassName">
<option value=""></option>
</select>
</div>
</div>
</div>
</div>
</form>

使用webapi绑定layui数据表格完整增删查改记录的更多相关文章

  1. Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

    一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...

  2. Django实现数据库中表格的增删查改

    1.urls.py """Django_demo1 URL Configuration The `urlpatterns` list routes URLs to vie ...

  3. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

  4. JDBC+Servlet+jsp(增删查改)

    先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了!  创建数据库 create database jdbc01 character set utf8 collat ...

  5. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  6. layui 数据表格自带的导出Excel,身份证等E+/000问题解决

    layui数据表格的工具栏自带导出Excel 会将身份证等 长整数的 自动变成E+并且 后面有000.从而导致数据不能完整导出. 解决方案: 1.先下载Excel的插件包.将压缩包内的两个js放到 l ...

  7. layui数据表格搜索

    简单介绍 我是通过Servlet传递json给layui数据表格模块,实现遍历操作的,不过数据量大的话还是需要搜索功能的.这是我参考网上大佬代码写出的搜索功能. 实现原理 要实现搜索功能,肯定需要链接 ...

  8. LayUI——数据表格使用

    Layui数据表格的实际项目使用 Layui的数据表格可谓是在后台管理的页面中经常用到的工具了 最近做项目就用到了,项目的要求是用数据表格显示出后台文章的列表并且每一行的文章都有对应的修改删除操作按钮 ...

  9. 【Layui】当Layui数据表格和Layui下拉框组合时发生的问题

    关于Layui数据表格用下拉框显示问题 如图所示 可以看见当点击下拉框时下拉选项被下拉框覆盖 此时你需要在数据表格渲染完成时的回调内添加如下代码即可 $(".sel_scrq"). ...

随机推荐

  1. css引入本地字体

    1.首先创建一个字体 @font-face { font-family: 'number_font'; //创建一个number_font字体名称 src: url('../../../style/F ...

  2. 基于raft共识搭建的Fabric1.4.4多机网络环境

    1准备工作介绍 1各个主机ip以及节点分配情况 各个主机的节点分配情况 ip地址 orderer0.example.com,peer0.org1.example.com 172.17.3.60 ord ...

  3. postgresql 和 mysql 数据库备份恢复以及时区问题

    概要 postgesql 12 备份/恢复脚本 时区设置 mysql 5.6 备份/恢复脚本 时区设置 概要 postgresql 和 mysql 是最常用的 2 种开源关系数据库, 很多项目也会优先 ...

  4. Hudi on Flink在顺丰的实践应用

    ​ 获取PDF版本 请关注"实时流式计算" 后台回复 "flink1015"

  5. 写了多年代码,你会 StackOverflow 吗

    写了多年代码,你会 StackOverflow 吗 Intro 准备写一个傻逼代码的系列文章,怎么写 StackOverflow 的代码,怎么写死锁代码,怎么写一个把 CPU 跑满,怎么写一个 Out ...

  6. mqtt网关

    MQTT网关 MQTT网关是可以是将普通的串口数据.Modbus RTU数据等转化为MQTT协议的从而方便与平台的对接,通过连接服务器.订阅和发布主题来实现传统设备和MQTT云端的联系.例如,笔记本和 ...

  7. day19 Pyhton学习 递归函数

    # 函数的递归 : 在一个函数的内部调用它自己 # import sys # sys.setrecursionlimit(1000000) # 设置递归的最大深度 # 总结 # 1.递归函数的定义 : ...

  8. 【暑假集训】HZOI2019 Luogu P1006 传纸条 二三四维解法

    写三次丢失两次,我谔谔,以后再不在博客园先保存我就去死 题目内容 洛谷链接 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学被安排坐成一个\(m\)行.\(n\ ...

  9. spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)

    一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2,  封装到Component类中再调用 3,  用Environment类从代码中直接访问 生 ...

  10. HTML语义化罗嗦罗嗦

    CSS还未诞生之前,为了实现一些样式效果.设计师必须使用一些物理标签,例如font.b等.这样会造成页面中充满了为实现各种样式的标签,特别是使用table标签来实现一些特殊的布局,俗称为"标 ...