bootstrptable实现查询操作(查找)(webapi)
首先贴界面
然后思路是,当你点击查询按钮时候,获取text的值,然后用refresh 更新bootstraptable的传递参数query,
然后交由controller进行处理(sql语句的编写)
先是html界面的
<div id="query-form" style="padding-bottom:10px;float:right">
<div margin-right:5px;">
<input name="description" type="text" style="float:left;width:150px;margin-right:5px;" class="form-control" id="findtext">
</div>
<div class="btn-group">
<button id="btn_search" onclick="customSearch()"
type="button" class="btn btn-primary btn-space">
<span class="fa fa-search" aria-hidden="true">查询</span>
</button>
<button id="btn_reset" onclick="resetSearch()" type="button" class="btn btn-default btn-space">
<span class="fa fa-eraser" aria-hidden="true">清空</span>
</button>
</div>
然后js
这是bootstraptable的配置以及加载
var oTable; //table
var findyouwant = ""; //模糊查询的text
$(function () {
oTable = new TableInit();
oTable.Init();
})
var oTableInit = new Object();
var TableInit = function () {
//初始化Table
oTableInit.Init = function () {
$('#menuTable').bootstrapTable({
url: '/menu/text', //请求后台的URL(*)
method: 'get', //请求方式(*)
toolbar: '#toolbar', //工具按钮用哪个容器
striped: true, //是否显示行间隔色
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
pagination: true, //是否显示分页(*)
sortable: false, //是否启用排序
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//传递参数(*)
sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*)
pageNumber: 1, //初始化加载第一页,默认第一页
pageSize: 10, //每页的记录行数(*)
pageList: [10, 25, 50, 100], //可供选择的每页的行数(*)
search: false,
contentType: "application/x-www-form-urlencoded",
strictSearch: true,
showColumns: true, //是否显示所有的列
showRefresh: true, //是否显示刷新按钮
minimumCountColumns: 2, //最少允许的列数
clickToSelect: true, //是否启用点击选中行
height: 700, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
uniqueId: "no", //每一行的唯一标识,一般为主键列
showToggle: true, //是否显示详细视图和列表视图的切换按钮
cardView: false, //是否显示详细视图
detailView: false, //是否显示父子表
columns: [
{ field: 'selectItem', radio: true },
{
field: 'fileid',
title: 'ID'
}, {
field: 'filename',
title: '文件名'
}, {
field: 'filetype',
title: '文件类型'
},
{
field: 'CreateDate',
title: '创建时间'
},
{
field: 'path',
title: '路径'
},
//{
// field: 'operate',
// title: '操作',
// formatter: operateFormatter //自定义方法,添加操作按钮
//},
],
rowStyle: function (row, index) {
var classesArr = ['success', 'info'];
var strclass = "";
if (index % 2 === 0) {//偶数行
strclass = classesArr[0];
} else {//奇数行
strclass = classesArr[1];
}
return { classes: strclass };
},//隔行变色
});
//console.log(data);
};
//bootstraptable的传递参数
//得到查询的参数
oTableInit.queryParams = function (params) {
var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
limit: params.limit, //页面大小
offset: params.offset,
menu: clickmenu,
find: findyouwant
};
return temp;
};
return oTableInit;
};
然后这两个是按钮单击事件,注意名字的对应就行
//模糊查询
function customSearch() {
findyouwant= $("#findtext").val();
var queryData = {};
queryData['limit'] = 10;
queryData['offset'] = 0;
queryData['find'] = findyouwant;
//调用这个函数来进行刷新数据
$('#menuTable').bootstrapTable('refresh', queryData);
//alert(ss);
}
//清空
function resetSearch() {
var queryData = {};
clickmenu = "";
findyouwant = "";
queryData['limit'] = 10;
queryData['offset'] = 0;
queryData['find'] = findyouwant;
//调用这个函数来进行刷新数据
$('#menuTable').bootstrapTable('refresh', queryData);
//alert(ss);
}
然后是controller处理,后面那个是为了把dataset转换成list,从而可以转换成json对象(其实也有直接datatable转换成json对象的)
/// <summary>
/// 当menu为空时,即是没选定目录,此时查询全部文件,当选定时会重新调用这个函数
/// 这个是用来遍历文件的函数
/// </summary>
/// <param name="limit">一页显示的条数</param>
/// <param name="offset">代表从第几行数据开始</param>
/// <param name="menu">表示在目录中选定的目录</param>
/// <param name="find">用于模糊查询的条件</param>
/// <returns></returns>
[Route("menu/text")]
public IHttpActionResult gettable(int limit, int offset, string menu,string find)
{
try
{
SqlConnection sqlConnection =
new SqlConnection(
"Data Source=(local);Initial Catalog=filemaneger;Persist Security Info=True;User ID=sa;Password=123456");
sqlConnection.Open();
string sql = "select fileid,filename,filetype,CreateDate,path from fileall where 1=1 ";
if (menu != null && menu != "")
{
sql += " and menuid=" + menu;
}
if (find != null && find != "") {
sql += " and filename like '%" + find + "%'";
}
DataSet dataSet = new DataSet();
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql, sqlConnection);
sqlDataAdapter.Fill(dataSet); //将数据填充进dataset
List<table> lt = DataSetToList<table>(dataSet, 0); //用到实体类将数据与实体类映射
var total = lt.Count; //总数
var rows = lt.Skip(offset).Take(limit).ToList(); //分页存储到List中
return Json(new { total = total, rows = rows },GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings); //然后才转换成Json传递
}
catch (Exception ex)
{
return Ok(ex.Message);
}
}
/// <summary>
/// DataSetToList
/// </summary>
/// <typeparam name="T">转换类型</typeparam>
/// <param name="ds">一个DataSet实例,也就是数据源</param>
/// <param name="tableIndext">DataSet容器里table的下标,只有用于取得哪个table,也就是需要转换表的索引</param>
/// <returns></returns>
public List<T> DataSetToList<T>(DataSet ds, int tableIndext)
{
//确认参数有效
if (ds == null || ds.Tables.Count <= 0 || tableIndext < 0)
{
return null;
}
DataTable dt = ds.Tables[tableIndext]; //取得DataSet里的一个下标为tableIndext的表,然后赋给dt
IList<T> list = new List<T>(); //实例化一个list
// 在这里写 获取T类型的所有公有属性。 注意这里仅仅是获取T类型的公有属性,不是公有方法,也不是公有字段,当然也不是私有属性
PropertyInfo[] tMembersAll = typeof(T).GetProperties();
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建泛型对象。为什么这里要创建一个泛型对象呢?是因为目前我不确定泛型的类型。
T t = Activator.CreateInstance<T>();
//获取t对象类型的所有公有属性。但是我不建议吧这条语句写在for循环里,因为没循环一次就要获取一次,占用资源,所以建议写在外面
//PropertyInfo[] tMembersAll = t.GetType().GetProperties();
for (int j = 0; j < dt.Columns.Count; j++)
{
//遍历tMembersAll
foreach (PropertyInfo tMember in tMembersAll)
{
//取dt表中j列的名字,并把名字转换成大写的字母。整条代码的意思是:如果列名和属性名称相同时赋值
if (dt.Columns[j].ColumnName.ToUpper().Equals(tMember.Name.ToUpper()))
{
//dt.Rows[i][j]表示取dt表里的第i行的第j列;DBNull是指数据库中当一个字段没有被设置值的时候的值,相当于数据库中的“空值”。
if (dt.Rows[i][j] != DBNull.Value)
{
//SetValue是指:将指定属性设置为指定值。 tMember是T泛型对象t的一个公有成员,整条代码的意思就是:将dt.Rows[i][j]赋值给t对象的tMember成员,参数详情请参照http://msdn.microsoft.com/zh-cn/library/3z2t396t(v=vs.100).aspx/html
tMember.SetValue(t, dt.Rows[i][j], null);
}
else
{
tMember.SetValue(t, null, null);
}
break;//注意这里的break是写在if语句里面的,意思就是说如果列名和属性名称相同并且已经赋值了,那么我就跳出foreach循环,进行j+1的下次循环
}
}
}
list.Add(t);
}
return list.ToList();
}