代码之家  ›  专栏  ›  技术社区  ›  rebelliard

jQuery DataTables服务器端处理使用ASP.NET网络表单

  •  33
  • rebelliard  · 技术社区  · 14 年前

    解决方案:

    public class Data : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // Paging parameters:
            var iDisplayLength = int.Parse(context.Request["iDisplayLength"]);
            var iDisplayStart = int.Parse(context.Request["iDisplayStart"]);
    
            // Sorting parameters
            var iSortCol = int.Parse(context.Request["iSortCol_0"]);
            var iSortDir = context.Request["sSortDir_0"];
    
            // Search parameters
            var sSearch = context.Request["sSearch"];
    
            // Fetch the data from a repository (in my case in-memory)
            var persons = Person.GetPersons();
    
            // Define an order function based on the iSortCol parameter
            Func<Person, object> order = person => iSortCol == 0 ? (object) person.Id : person.Name;
    
            // Define the order direction based on the iSortDir parameter
            persons = "desc" == iSortDir ? persons.OrderByDescending(order) : persons.OrderBy(order);
    
            // prepare an anonymous object for JSON serialization
            var result = new
                             {
                                 iTotalRecords = persons.Count(),
                                 iTotalDisplayRecords = persons.Count(),
                                 aaData = persons
                                     .Where(p => p.Name.Contains(sSearch))  // Search: Avoid Contains() in production
                                     .Where(p => p.Id.ToString().Contains(sSearch))
                                     .Select(p => new[] {p.Id.ToString(), p.Name})
                                     .Skip(iDisplayStart)   // Paging
                                     .Take(iDisplayLength)
                             };
    
            var serializer = new JavaScriptSerializer();
            var json = serializer.Serialize(result);
            context.Response.ContentType = "application/json";
            context.Response.Write(json);
        }
    
        public bool IsReusable { get { return false; } }
    }
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public static IEnumerable<Person> GetPersons()
        {
            for (int i = 0; i < 57; i++)
            {
                yield return new Person { Id = i, Name = "name " + i };
            }
        }
    }
    
    5 回复  |  直到 14 年前
        1
  •  48
  •   Darin Dimitrov    14 年前

    我写了一个简单的例子来说明这个想法。

    首先编写一个通用处理程序来处理服务器端的数据( Data.ashx 但这可能是一个网页、web服务、任何能够返回JSON格式数据的服务器端脚本):

    public class Data : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // Those parameters are sent by the plugin
            var iDisplayLength = int.Parse(context.Request["iDisplayLength"]);
            var iDisplayStart = int.Parse(context.Request["iDisplayStart"]);
            var iSortCol = int.Parse(context.Request["iSortCol_0"]);
            var iSortDir = context.Request["sSortDir_0"];
    
            // Fetch the data from a repository (in my case in-memory)
            var persons = Person.GetPersons();
    
            // Define an order function based on the iSortCol parameter
            Func<Person, object> order = p => 
            {
                if (iSortCol == 0) 
                { 
                    return p.Id; 
                }
                return p.Name;
            };
    
            // Define the order direction based on the iSortDir parameter
            if ("desc" == iSortDir)
            {
                persons = persons.OrderByDescending(order);
            }
            else
            {
                persons = persons.OrderBy(order);
            }
    
            // prepare an anonymous object for JSON serialization
            var result = new
            {
                iTotalRecords = persons.Count(),
                iTotalDisplayRecords = persons.Count(),
                aaData = persons
                    .Select(p => new[] { p.Id.ToString(), p.Name })
                    .Skip(iDisplayStart)
                    .Take(iDisplayLength)
            };
    
            var serializer = new JavaScriptSerializer();
            var json = serializer.Serialize(result);
            context.Response.ContentType = "application/json";
            context.Response.Write(json);
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public static IEnumerable<Person> GetPersons()
        {
            for (int i = 0; i < 57; i++)
            {
                yield return new Person
                {
                    Id = i,
                    Name = "name " + i
                };
            }
        }
    }
    

    <%@ Page Title="Home Page" Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head id="Head1" runat="server">
        <title></title>
        <link rel="stylesheet" type="text/css" href="/styles/demo_table.css" /> 
        <script type="text/javascript" src="/scripts/jquery-1.4.1.js"></script>
        <script type="text/javascript" src="/scripts/jquery.dataTables.js"></script>
        <script type="text/javascript">
            $(function () {
                $('#example').dataTable({
                    'bProcessing': true,
                    'bServerSide': true,
                    'sAjaxSource': '/data.ashx'
                });
            });
        </script>
    </head>
    <body>
        <form id="Form1" runat="server">
            <table cellpadding="0" cellspacing="0" border="0" class="display" id="example"> 
                <thead> 
                <tr> 
                    <th>ID</th> 
                    <th>Name</th> 
                </tr> 
                </thead> 
                <tbody> 
                <tr> 
                    <td colspan="5" class="dataTables_empty">Loading data from server</td> 
                </tr> 
                </tbody> 
            </table>
        </form>
    </body>
    </html>
    

    这个例子过于简单化了,但我希望它能说明如何开始的基础知识。

        2
  •  2
  •   Holystream    14 年前

    您列出的示例页实际上是在初始化时进行排序、分页和筛选的。基本上,通过查询字符串传递这些数据。

    sAjaxSource": "../examples_support/server_processing.ashx?SortBy=FirstName&FilterBy=StackOverFlow"
    

    话虽如此,如果您想覆盖某些行为或从功能上扩展dataTable,您有几个选项: Extending dataTable functionality Customizing Scrolling

        3
  •  1
  •   Fabio    14 年前

    我是asp.Net开发商。。。请记住,.net开发人员使用.net控件而不是javascript控件来构建网页。

    区别在于:一个asp.net控件是一个服务器端控件,您不用自己编写javascript来管理它,而是用C编程#/图书管理系统. 这个asp.net控件在网站运行时自动生成客户端javascript控件。

    因此,如果您是.net开发人员,我建议您使用这种方法。如果您是javascript开发人员,并且只构建应用程序的客户端接口,那么您可能需要一个webService,它以XML格式提供服务器端数据,您可以通过HTTP调用和读取这些数据。但是,要“搜索”,通过AJAX提供“分页”和“排序”,您需要开发服务器端。。。

        4
  •  1
  •   Fabio    14 年前