JQGrid Showing empty while processing more than 3200 records with MVC 4

572 Views Asked by At

JQGrid is working fine for records up to 3000 and so with loadone:true , while it comes to more than 3200 it is showing empty grid. I would like to take up with server side paging and loadonce:false. is there any better way to load the data loadonce:true and show some huge amount of data like 20k records? if we are going to use server side paging, we should fetch only specific amount of records from database ? please find my code below and point me if any issues.

Model:

public class GOALogging
{
    public int SERV_TRANS_ID { get; set; }
    public string ACT_YEAR  { get; set; }
    public string SEAS { get; set; }
    public string RESPONSE_DT { get; set; }
}

Controller

  public ActionResult Index()
  {
      return View();
  }

 public JsonResult getRecords()
  {
      List<GOALogging> items = new List<GOALogging>();
      items = GetLoggingDetails();
      var a = Json(items, JsonRequestBehavior.AllowGet);
      return a;
  }

public List<GOALogging> GetLoggingDetails()
    {
        string connString = ConfigurationManager.ConnectionStrings["ACTOLConnection"].ConnectionString;
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = 6000;
        cmd.CommandText = "GET_SAMPLEDETAILS";
        cmd.Connection = conn;
        conn.Open();
        DataTable dataTable = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dataTable);
        conn.Close();
        da.Dispose();

        List<GOALogging> items = new List<GOALogging>();
        foreach (DataRow row in dataTable.Rows)
        {
            items.Add(new GOALogging
            {
                SERV_TRANS_ID = Convert.ToInt32(row["SERV_TRANS_ID"]),
                ACT_YEAR = row["ACT_YEAR"].ToString(),
                SEAS = row["SEAS"].ToString(),
                RESPONSE_DT = row["RESPONSE_DT"].ToString()
            });
        }
        return items;
    }

View

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/grid.locale-en.js"></script>
<script src="~/Scripts/jquery-1.11.0.min.js"></script>
<link href="~/Scripts/lib-UI-jquery-css-custom-theme-jquery-ui-1.9.2.custom.css" rel="stylesheet" />
<script src="~/Scripts/jquery.jqGrid.js"></script>
<script src="~/Scripts/grid.locale-en.js"></script>
<link href="~/Scripts/ui.jqgrid.css" rel="stylesheet" />
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/base/jquery-ui.css" rel="stylesheet" />
</head>
<body>
<script type="text/javascript">
    $(function () {
        $("#myGrid").jqGrid({
            url: '/GOA/getRecords',
            datatype: 'json',
            myType: 'GET',
            colNames: ['ID',
                'YEAR', 'SEASON', 'RESPONSE_DT'],
            colModel: [
            { name: 'SERV_TRANS_ID' },
            { name: 'ACT_YEAR' },
            { name: 'SEAS' },
            { name: 'RESPONSE_DT' }
            ],
            pager: $('#myPager'),
            jsonReader: { cell: ""},
            rowNum: 10,
            sortname: 'SERV_TRANS_ID',
            sortorder: 'desc',
            gridview: true,
            loadonce: true,
            rowList: [10, 20, 50, 100],
            width:1120,
            height:280,
            viewrecords: true,
            caption: 'Past 24 hours ACTService Processing Status'
        });
    });
</script>
<div >
    <table id="myGrid" ></table>

    <div id="myPager"></div>
</div>
</body>
</html>
2

There are 2 best solutions below

0
On BEST ANSWER

This is because of Maximum length restriction in .Net, you can use below formated code in your controller to go ahead of issue.

        List<MEmployee> items = new List<MEmployee>();
        items = getData();
        var a = Json(items, JsonRequestBehavior.AllowGet);
        a.MaxJsonLength = int.MaxValue;
        return a;

Reference link

0
On

I suspect that you have some problem with the size of serialized data. I mean that you have pure ASP.NET MVC problem. Old version of ASP.NET MVC uses very old JavaScriptSerializer for serialization which have the restriction described here and here.

I would recommend you to use Newtonsoft.Json instead of JavaScriptSerializer. If you would migrate to MVC5 then it will be automatically. Newtonsoft.Json works much more quickly as JavaScriptSerializer and have no such restrictions.

Here you can download the demo project which used simple ASP.NET MVC for editing the data. It uses Newtonsoft.Json of cause.

It's recommended additionally to use compression of returned JSON data. Look at here for example.