I am trying to bind Asp.Net Repeater Control for Ajax Data using DataTables Plugin but its not working Following is my Code.
$(document).ready(function () {
$('#tblMessages').dataTable({
"sDom": 'T<"clear">lfrtip',
"oLanguage": { "sSearch": "Search the Messages:" },
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"iDisplayLength": 25,
"bProcessing": true,
"bServerSide": true,
"bFilter": true,
"sAjaxSource": "../QCDataServices.asmx/GetPatients",
"fnServerData": function(sSource, aoData, fnCallback) {
aoData.push("{pageSize:'20',pageNumber:'1'}");
$.ajax({
"type": "POST",
"dataType": 'json',
"contentType": "application/json; charset=utf-8",
"url": sSource,
"data": aoData,
"success": function (msg) {
fnCallback(msg.d);
}
});
},
"sPaginationType": "full_numbers",
"oTableTools": {
"aButtons": [
"copy",
"csv",
"xls",
{
"sExtends": "pdf"
},
"print"
]
},
"aaSorting": [[0, "desc"]]
});
});
Here is the Class which is obtained as Json object
public class PatientGridDataSet
{
public int sEcho { get; set; }
public int iTotalRecords { get; set; }
public int iTotalDisplayRecord { get; set; }
public List<Patient> aaData { get; set; }
}
Here is the Service Method
[WebMethod(EnableSession=true)]
public PatientGridDataSet GetPatients(int pageSize, int pageNumber)
{
var patlist=Patients("", "", "");
return new PatientGridDataSet {sEcho = pageNumber,iTotalRecords = patlist.Count, iTotalDisplayRecord = pageSize, aaData= patlist.Skip(pageSize * pageNumber).Take(pageSize).ToList() };
}
[WebMethod(EnableSession = true)]
public List<Patient> Patients(string searchIn, string Operator, string searchString)
{
List<Patient> result;
try
{
DataRow[] rows;
var table = new dsVw_Patients.vw_PatientsDataTable();
var adapter = new vw_PatientsTableAdapter();
adapter.Fill(table);
//DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
string hid = Context.Session["HospitalId"] == null ? "0" : Context.Session["HospitalId"].ToString();
string rid = Context.Session["RoleId"] == null ? "0" : Context.Session["RoleId"].ToString();
string uid = Context.Session["UserId"] == null ? "0" : Context.Session["UserId"].ToString();
if (searchIn.Equals(""))
{
rows = hid.Equals("0") ? table.DefaultView.ToTable(true).Select("1=1", "PatientName ASC") : table.DefaultView.ToTable(true).Select("HospitalId="+hid, "PatientName ASC");
if(rid.Equals("5"))
rows = table.DefaultView.ToTable(true).Select("UserId="+uid, "PatientName ASC");
}
else
{
if (hid.Equals("0"))
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select(searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select(searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
else
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select("HospitalId=" + hid+" and "+searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select("HospitalId=" + hid + " and " + searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
if (rid.Equals("5"))
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select(searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select(searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
}
var tieup=new clsTieUpCompanies();
result = rows.Select(row => new Patient
{
PatientId = Convert.ToInt32(row["PatientId"]), PatientName = row["PatientName"].ToString(), Address = row["Address"].ToString(), Street = row["Street"].ToString(), City = row["City"].ToString(), ContactNo = row["Contactno"].ToString(), MobileNo = row["MobileNo"].ToString(), Email = row["Email"].ToString(), State = row["State"].ToString(), Country = row["Country"].ToString(), BPLCardNo = row["BPLCardNo"].ToString(), Company = tieup.GetTieupCompanyName(Convert.ToInt32(row["CompanyId"]))
}).ToList();
}
catch (Exception)
{
result = null;
}
return result;
}
First Of when i call my webservice method it does not go there please tell me rest code is ok or not
Here is the markup
<asp:Repeater ID="rptList" runat="server">
<HeaderTemplate>
<table id="tblMessages">
<thead>
<tr>
<th>
Patient Name
</th>
<th>
Address
</th>
<th>
City
</th>
<th>
Contact No
</th>
<th>
MobileNo
</th>
<th>
BPL Card No.
</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%# Eval("PatientName")%>
</td>
<td>
<%#Eval("Address")%>
</td>
<td>
<%# Eval("City")%>
</td>
<td>
<%# Eval("ContactNo")%>
</td>
<td>
<%# Eval("MobileNo")%>
</td>
<td>
<%# Eval("BPLCardNo")%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody> </table>
</FooterTemplate>
</asp:Repeater>
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
@Tim B James
I have got it worked.But the very reason i tried used it for is defied. It takes a lot of time to fetch only 80 records. Here Find my client code.
$(document).ready(function () {
var grid = $('#tblMessages').dataTable({
"sDom": 'T<"clear">lfrtip',
"oLanguage": { "sSearch": "Search the Messages:" },
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"iDisplayLength": 25,
"oTableTools": {
"aButtons": [
"copy",
"csv",
"xls",
{
"sExtends": "pdf"
},
"print"
]
},
"bProcessing": true,
"bSort": true,
"sPaginationType": "full_numbers",
"bServerSide": true,
"sAjaxSource": "../QCDataServices.asmx/GetPatients",
"fnServerData": function (sSource, aoData, fnCallback) {
var jsonAOData = JSON.stringify(aoData);
$.ajax({
type: "POST",
//dataType: "json",
contentType: "application/json; charset=utf-8",
url: sSource,
data: "{jsonAOData : '" + jsonAOData + "'}",
success: function (msg) {
fnCallback(JSON.parse(msg.d));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.responseText);
}
});
},
"aoColumnDefs": [
{ "fnRender": function (oObj) {
return "<a href='../FrmMessage.aspx?id='" + oObj.aData[0] + "><img src='../../images/SMS.png'/></a>";
},
"bSortable": false,
"aTargets": [0]
},
{ "sName": "PatientName",
"bSearchable": true,
"aTargets": [1]
},
{ "sName": "Address",
"bSearchable": true,
"bSortable": true,
"aTargets": [2]
},
{ "sName": "ContactNo", "aTargets": [3] },
{ "sName": "MobileNo", "aTargets": [4] },
{ "sName": "BPL Card No", "aTargets": [5] }
]
});
grid.fnSetFilteringDelay(1000);
});
I have used Solution provided by this link
http://activeengine.wordpress.com/2011/02/09/datatablepager-now-has-multi-column-sort-capability-for-datatables-net/
My Webservice Methods are
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetPatients(string jsonAOData)
{
var patients= Patients("", "", "");
var dataTablePager = new DataTablePager<Patient>(jsonAOData, patients);
var formattedList = dataTablePager.Filter();
return JsonConvert.SerializeObject(formattedList);
}
[WebMethod(EnableSession = true)]
public IQueryable<Patient> Patients(string searchIn, string Operator, string searchString)
{
IQueryable<Patient> result ;
try
{
DataRow[] rows;
var table = new dsVw_Patients.vw_PatientsDataTable();
var adapter = new vw_PatientsTableAdapter();
adapter.Fill(table);
//DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
var hid = Context.Session["HospitalId"] == null ? "0" : Context.Session["HospitalId"].ToString();
var rid = Context.Session["RoleId"] == null ? "0" : Context.Session["RoleId"].ToString();
var uid = Context.Session["UserId"] == null ? "0" : Context.Session["UserId"].ToString();
if (searchIn.Equals(""))
{
rows = hid.Equals("0") ? table.DefaultView.ToTable(true).Select("1=1", "PatientName ASC") : table.DefaultView.ToTable(true).Select("HospitalId="+hid, "PatientName ASC");
if(rid.Equals("5"))
rows = table.DefaultView.ToTable(true).Select("UserId="+uid, "PatientName ASC");
}
else
{
if (hid.Equals("0"))
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select(searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select(searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
else
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select("HospitalId=" + hid+" and "+searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select("HospitalId=" + hid + " and " + searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
if (rid.Equals("5"))
{
rows = Operator.Contains("%") ? table.DefaultView.ToTable(true).Select(searchIn + " like '" + Operator.Replace("_", searchString) + "'", searchIn + " ASC") : table.DefaultView.ToTable(true).Select(searchIn + " " + Operator + " '" + searchString + "'", searchIn + " ASC");
}
}
//.Skip(pageSize*pageNumber).Take(pageSize).ToList().
var tieup=new clsTieUpCompanies();
result = rows.Select(row => new Patient
{
PatientId = Convert.ToInt32(row["PatientId"]), PatientName = row["PatientName"].ToString(), Address = row["Address"].ToString(), Street = row["Street"].ToString(), City = row["City"].ToString(), ContactNo = row["Contactno"].ToString(), MobileNo = row["MobileNo"].ToString(), Email = row["Email"].ToString(), State = row["State"].ToString(), Country = row["Country"].ToString(), BPLCardNo = row["BPLCardNo"].ToString(), Company = tieup.GetTieupCompanyName(Convert.ToInt32(row["CompanyId"]))
}).AsQueryable();
}
catch (Exception)
{
result = null;
}
return result;
}
Please guide how to improve the performacnce.
Method 2
If you are not binding data to the <asp:Repeater> on page load, then the table within will never be rendered on the page. So <table id="tblMessages"> will never exist in the html.
Why not just use plain html and get rid of the repeater control?
<table id="tblMessages">
<thead>
<tr>
<th>
Patient Name
</th>
<th>
Address
</th>
<th>
City
</th>
<th>
Contact No
</th>
<th>
MobileNo
</th>
<th>
BPL Card No.
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0