34

問題:

  • ASP.NETWebFormsを使用したjQueryDataTablesサーバー側処理。

解決:

  • Darin Dimitrovは、ページと並べ替えの例を使用して質問に回答しましたが、検索は行いません。これが彼の例で検索を機能させるための彼の仕事の私の**基本的な**修正です:
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 };
        }
    }
}
4

5 に答える 5

49

アイデアを説明する簡単な例を書きました。

サーバー側でデータを処理するための汎用ハンドラーを作成することから始めます(Data.ashxただし、これはWebページ、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
            };
        }
    }
}

そして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>

例は単純化されすぎていますが、見つめられる方法の基本を説明してくれることを願っています。

于 2010-08-30T15:29:01.883 に答える
2

リストしたサンプルページは、実際には初期化時に並べ替え、ページ分割、フィルタリングを行います。基本的に、これらのデータはクエリ文字列を介して渡されます。

何かのようなもの:

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

そうは言っても、一部の動作をオーバーライドしたい場合、またはdataTableの機能を拡張したい場合は、いくつかのオプションがあります。dataTable機能の拡張 スクロールのカスタマイズ

上記の例に従って、フィルタリング、並べ替え、ページ付けのためにカスタマイズすることができます

于 2010-08-25T21:28:54.373 に答える
1

私はasp.Net開発者です....net開発者は、javascriptコントロールではなく、.netコントロールを使用してWebページを構築するために使用されることに注意してください。

違いは次のとおりです。asp.netコントロールはサーバー側のコントロールであり、JavaScriptを自分で作成せずに管理しますが、C#/VB.netでプログラミングします。asp.netコントロールは、Webサイトの実行時に、クライアント側のjavascriptコントロールを自動的に生成します。

そのアプローチはより「現代的」で本当に強力です。

したがって、.net開発者の場合は、このアプローチを使用することをお勧めします。JavaScript開発者であり、アプリケーションのクライアント側インターフェースのみを構築している場合は、HTTPを介して呼び出して読み取ることができるXML形式でサーバー側データを提供するwebServiceが必要になる可能性があります。しかし、「検索」するには、サーバー側で開発する必要があるAJAXを介して「ページ付け」と「並べ替え」を提供します...

于 2010-08-20T14:09:37.497 に答える
1

多分これは役立つかもしれませんか?http://www.codeproject.com/KB/aspnet/ASPNET_DataTable_to_JSON.aspx

于 2010-08-23T14:26:14.767 に答える
1

http://naspinski.net/post/REAL-AJAX-with-AspNet-(not-AspNet-AJAX).aspx

この男は、asp.netとdatatablesでajaxを動作させました。

于 2010-08-30T13:31:00.793 に答える