JQuery Datatable Plugin Loading Asp.Net Repeater w

2020-04-17 03:49发布

问题:

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>

回答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.



回答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>