2010-08-20 28 views
32

Problema:jQuery DataTables procesamiento del lado del servidor usando ASP.NET WebForms

  • jQuery procesamiento del lado del servidor DataTables usando ASP.NET WebForms.

Solución:

  • Darin Dimitrov respondieron a la pregunta con un ejemplo qué páginas y géneros, pero no hace ninguna búsqueda. Aquí está mi ** ** modificación básica de su trabajo para hacer la búsqueda de trabajo en su ejemplo:
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 }; 
     } 
    } 
} 
+0

He implementado tablas de datos en todo mi proyecto en PHP, tuve que crear mis propias clases porque ese ejemplo no es realmente útil fuera de tareas específicas (y es difícil de seguir). Debería tratar con alrededor de 100 líneas para la solicitud y la respuesta de su clase. Normalmente no trato con ASP.net pero veré si puedo encontrar algo para ti. – Incognito

+0

He probado este código y me doy cuenta de que la búsqueda y el recuento de registros siguen siendo los mismos cuando filtra el objeto. – zXSwordXz

Respuesta

48

Escribí un ejemplo simple que debería ilustrar la idea.

empezar por escribir un controlador genérico para el manejo de datos en el lado del servidor (Data.ashx pero esto podría ser una página web, servicios web, script del lado del servidor de nada capaz de devolver datos JSON con formato):

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 
      }; 
     } 
    } 
} 

Y a continuación, un formulario Web:

<%@ 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> 

El ejemplo está muy simplificado, pero espero que ilustran los conceptos básicos sobre cómo miraba.

+0

Exactamente la patada que necesitaba. Muchas gracias. - Debo agregar que esto funciona siempre que cambie el nombre de tu clase .ashx a "datos" en minúsculas (cómo se usa en la página .aspx). – rebelliard

+0

Usted dijo que: "Comience escribiendo un manejador genérico para manejar datos en el lado del servidor (Data.ashx pero podría ser una página web, servicio web, cualquier script del lado del servidor capaz de devolver datos formateados JSON)". No quiero usar controladores, mis proyectos tienen mucha grilla y quiero centralizarlos en un servicio web. Pero, ¿cómo manejar el contexto del método web del servicio web? – Vinh

+0

@Vinh, ¿qué servicio web? ¿Estás hablando de un servicio habilitado para SOAP? –

1

estoy asp.Net desarrollador ... Por favor, tome en cuenta que desarrolladores .NET se utilizan para construir Web páginas que usan controles .net, no controles javascript.

La diferencia es: un control asp.net es un control del lado del servidor, lo gestiona sin escribir javascript, pero programando en C#/VB.net. El control asp.net genera automáticamente el control javascript del lado del cliente cuando se ejecuta el sitio web.

Su enfoque es más "moderno" y realmente poderoso.

Si eres un desarrollador de .net, te sugiero que utilices este enfoque. Si usted es un desarrollador de JavaScript y está construyendo solo la interfaz del lado del cliente de su aplicación, probablemente necesite un servicio web que proporcione los datos del lado del servidor en formato XML que puede llamar y leer a través de HTTP. Pero, para "buscar", proporcionar "paginación" y "ordenar" a través de AJAX, necesita desarrollar el servidor ...

+0

Estoy al tanto de eso, por lo que estoy preguntando si alguien ha devuelto con éxito los datos XML/jSON a la tabla de datos jQuery utilizando ASP.NET. Yo también soy desarrollador de .NET y puedo manejarlo desde cero, pero primero estoy tratando de ver si alguien ha descubierto las tablas de datos con .NET. :) – rebelliard

+1

Apuesto a que se ejecutará más rápido que la forma de control del servidor .Net. – maxisam

2

Las páginas de ejemplo que enumeró en realidad ordenan, paginan, filtran en la inicialización. Básicamente, pasas esos datos a través de la cadena de consulta.

Algo así como:

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

Una vez dicho esto, si desea anular algún comportamiento o si desea ampliar functionaly de dataTable, usted tiene algunas opciones: Extending dataTable functionalityCustomizing Scrolling

Puede seguir los ejemplos anteriores y personalizarlos para filtrar, ordenar, y la paginación

Cuestiones relacionadas