jQuery Datatables 使用 WCF 进行服务器端处理
本文关键字:服务器端 处理 WCF Datatables 使用 jQuery | 更新日期: 2023-09-27 18:33:01
我是Datatables服务器端处理的新手,我没有找到合适的示例或示例代码来使用wcf服务进行服务器端处理。
我正在尝试使用 jQuery 数据表 (datatables.net( 连接到 WCF 服务以获取数据的服务器端处理。
我已经使用 iDisplayStart 和 iDisplayLength(我作为 wcf 方法的参数获得(实现了分页,以构造 sql 查询(在 wcf 方法中(以限制要显示的记录数量。
现在,问题是如何在 wcf 方法中实现搜索和排序。为此,我需要单击哪一列进行排序,以及显示哪些列来构造 sql WHERE 子句。
在这里,我的方法是基于前端的数据表构造 sql 查询。这是使用 wcf 完成数据表服务器端处理的方法吗?
如果问题的任何部分不清楚,请发表评论。
以下是前端代码
脚本
$(document).ready(function () {
$('#example').dataTable({
"aoColumns": [
{ "sTitle": "#", "sName": "ID", "mData": "ID"},
{ "sTitle": "PIN Number", "sName": "PIN", "mData": "PIN" },
{ "sTitle": "Amount (Rs.)", "sName": "Amount", "mData": "Amount" }
],
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bSort": true,
"bProcessing": true,
"bServerSide": true,
"bAutoWidth": true,
"sAjaxSource": "http://localhost:61216/datatabletestservice.svc/gettable",
"fnServerData": function (sSource, aoData, fnCallback) {
$.ajax({
"datatType": 'json',
"contentType": 'application/json',
"url": sSource,
"data": aoData,
"success": function (msg) {
var json = $.parseJSON(msg);
fnCallback(json);
}
})
},
});
});
</script>
身体
<body>
<form id="form1" runat="server">
<div>
<table id="example" width="100%">
<thead>
</thead>
<tbody>
</tbody>
</table>
</div>
</form>
</body>
WCF 方法(后端(
public string GetTable(int iDisplayStart, int iDisplayLength, string sSearch, bool bEscapeRegex, int iColumns, int iSortingCols, int iSortCol_0, string sSortDir_0, int sEcho)
{
string query;
DataTable dt;
DateTime t1 = DateTime.Now;
string connectionstring = "server=my_server;database=my_db;uid=myuser;password=mypassword;";
query = "SELECT SQL_CALC_FOUND_ROWS * FROM voucher LIMIT " + iDisplayStart + ", " + iDisplayLength;
dt = MySqlHelper.ExecuteDatatable(connectionstring, query);
int totalRows = Convert.ToInt32(MySqlHelper.ExecuteScalar(connectionstring, "SELECT FOUND_ROWS()"));
string jsonString = JsonUtils.GetPlainJsonDataByDataTable(dt);
var result = JsonUtils.GetObjectFromJson<dynamic>(jsonString);
string test = "{" +
"'"sEcho'": '"" + sEcho + "'", " +
"'"iTotalRecords'": '"" + totalRows + "'", " +
"'"iTotalDisplayRecords'": '"" + totalRows + "'", " +
"'"aaData'": " + result +
"}";
return test;
}
当请求从 DataTable 传入时,参数 iSortCol_0 包含正在排序的列的索引,参数 sSortDir_0 指定排序方向(升序、降序(。
如下所述:http://rantdriven.com/post/Using-Datatablesnet-JQuery-Plug-in-with-WCF-Services.aspx
编辑
可以使用 iSortCol_0 整数并将其传递到 sql 查询顺序 by 子句中。这称为按序数排序,大多数数据库引擎都支持。如果iSortCol_0从零开始,则需要在传入之前向其添加 1。
$('#example').dataTable({
"bSort": true,
"bProcessing": true,
"bServerSide": true,
"bAutoWidth": true,
"lengthMenu": [[5, 10,-1], [5, 10, "All"]],
"sAjaxSource": "http://------/Service1.svc/gettable",
"fnServerData": function (sSource, aoData, fnCallback) {
var tblid = { name: "tblId", value: "test" };//pass extra param
aoData.push(tblid);
$.ajax({
"datatType": 'json',
"contentType": 'application/json',
"url": sSource,
"data": aoData,
"success": function (msg) {
var json = $.parseJSON(msg);
fnCallback(json);
}
})
},
});
WCF :
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, Method = "GET")]
string GetTable(int iDisplayStart,
int iDisplayLength,
string sSearch,
bool bEscapeRegex,
int iColumns,
int iSortingCols,
int iSortCol_0,
string sSortDir_0,
int sEcho,
int webSiteId,
int categoryId, string tblId);
public string GetTable(int iDisplayStart, int iDisplayLength, string sSearch, bool bEscapeRegex,
int iColumns,int iSortingCols,int iSortCol_0,string sSortDir_0,int sEcho,int webSiteId,int categoryIdm,string tblId)
{
List<object[]> items = new List<object[]>();
using (SqlConnection con = new SqlConnection(@"connection"))
{
using (SqlCommand cmd = new SqlCommand("DT_TEST", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@iDisplayStart", SqlDbType.Int).Value = iDisplayStart;
cmd.Parameters.Add("@iDisplayLength", SqlDbType.Int).Value = iDisplayLength;
cmd.Parameters.Add("@sSearch", SqlDbType.VarChar).Value = sSearch;
cmd.Parameters.Add("@bEscapeRegex", SqlDbType.Bit).Value = bEscapeRegex;
cmd.Parameters.Add("@iColumns", SqlDbType.Int).Value = iColumns;
cmd.Parameters.Add("@iSortingCols", SqlDbType.Int).Value = iSortingCols;
cmd.Parameters.Add("@iSortCol_0", SqlDbType.Int).Value = iSortCol_0;
cmd.Parameters.Add("@sSortDir_0", SqlDbType.VarChar).Value = sSortDir_0;
cmd.Parameters.Add("@sEcho", SqlDbType.Int).Value = sEcho;
cmd.Parameters.Add("@webSiteId", SqlDbType.Int).Value = webSiteId;
cmd.Parameters.Add("@categoryIdm", SqlDbType.Int).Value = categoryIdm;
cmd.Parameters.Add("@tblId", SqlDbType.VarChar).Value = tblId;
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
List<object> rowitem = new List<object>();
rowitem.Add(rdr.GetString(1));
rowitem.Add(rdr.GetString(2));
rowitem.Add(rdr.GetSqlDateTime(3).ToString());
items.Add(rowitem.ToArray());
}
}
}
JavaScriptSerializer serialiser = new JavaScriptSerializer();
var result = items.ToArray();
return serialiser.Serialize(new
{
sEcho,
iTotalRecords = counr,
iTotalDisplayRecords = count,
aaData = result
});
}
以另一种方式引用