先貼個界面,即點選ztree的目錄,然後讓bootstrap更新目錄下的資料(webapi)

-
先是在剛打開頁面時,加載全部檔案
這是剛開始加載頁面用到的的Js ,初始化ztree和bootstrap
var clickmenu = "";
var oTable;
$(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: true, //是否顯示表格搜尋,此搜尋是用戶端搜尋,不會進服務端,是以,個人感覺意義不大
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: 'CreaateData',
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);
};
//得到查詢的參數
oTableInit.queryParams = function (params) {
var temp = { //這裡的鍵的名字和控制器的變量名必須一直,這邊改動,控制器也需要改成一樣的
limit: params.limit, //頁面大小
offset: params.offset,
menu: clickmenu
};
return temp;
};
return oTableInit;
};
function operateFormatter(value, row, index) {//賦予的參數
return [
'<button class="btn active disabled" id="openfile">打開檔案</button>'
].join('');
}
var zTreeObj;
// zTree 的參數配置,深入使用請參考 API 文檔(setting 配置詳解)
var setting = {};
// zTree 的資料屬性,深入使用請參考 API 文檔(zTreeNode 節點資料詳解)
//var zNodes = [
//{name:"test1", open:true, children:[
// {name:"test1_1"}, {name:"test1_2"}]},
//{name:"test2", open:true, children:[
// {
// name: "test2_1", children: [
// { name: "teeee" }, {name:"sfds"}
// ]
// }, { name: "test2_2" }]
//}
//];
var setting = { //這樣設定了,才能用下面那種Json格式
data: {
simpleData: {
enable: true
}
},
callback: { //這是定義開啟click按鈕的
onClick: onClick
}
};
2、controller接收請求并且傳回資料
// GET api/menu/
[Route("menu/ss")]
public string getztreenode()
{
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 menuid as id,previousid as pId,Name as name,isParent from menu";
DataSet dataSet = new DataSet();
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql, sqlConnection);
sqlDataAdapter.Fill(dataSet); //将資料填充進dataset
return JsonConvert.SerializeObject(dataSet); //将資料轉換成json格式
}
catch (Exception ex)
{
return ex.ToString();
}
}
/// <summary>
/// 當menu為空時,即是沒標明目錄,此時查詢全部檔案,當選定時會重新調用這個函數
/// 這個是用來周遊檔案的函數
/// </summary>
/// <param name="limit">一頁顯示的條數</param>
/// <param name="offset">代表從第幾行資料開始</param>
/// <param name="menu">表示在目錄中標明的目錄</param>
/// <returns></returns>
[Route("menu/text")]
public IHttpActionResult gettable(int limit, int offset, string menu)
{
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 from fileall where 1=1 ";
if (menu != null && menu != "")
{
sql += " and menuid=" + menu;
}
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 });
}
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();
}
有些函數是為了轉換json對象格式而弄得
3、點選ztree時,js
//當菜單樹被點選時
function onClick(event, treeId, treeNode, clickFlag) {
clickmenu = treeNode.id; //點選的話會擷取到該節點的id号,至于為什麼是這個,你可以用console.log(treeNode)自己看下該對象的值
var queryData = {};
queryData['limit'] =10; //這裡不自己弄的話就把上面那個轉換成全局變量
queryData['offset'] =0;
queryData['menu'] =clickmenu;
//調用這個函數來進行重新整理資料
$('#menuTable').bootstrapTable('refresh', queryData);
//console.log(treeNode);
}
4、然後重新整理的話會再調用處理boostrap的controller函數,然後就行啦,不明白的話仔細看下sql語句,是動态指派的
5、忘記說了,需要定義個實體類,原理就是用dataset擷取資料,然後用實體類對應,然後再将其轉換成List存儲,然後再轉換成json對象,然後才傳到bootsrap,下面這個是代碼
public class table
{
public string fileid { get; set; }
public string filename { get; set; }
public string filetype { get; set; }
public string path { get; set; }
public DateTime CreateDate { get; set; }
}