【问题标题】:How can I implement jQuery DataTables plugin using C#, ASP.NET, SQL Server side processing?如何使用 C#、ASP.NET、SQL Server 端处理实现 jQuery DataTables 插件?
【发布时间】:2012-09-17 18:20:48
【问题描述】:

如何使用 C#、ASP.NET、带有 ajax 和 web 服务的 SQL Server 端处理来实现 jQuery DataTables 插件?

想用 c# 和 ASP.NET 实现一个 Datatables 网格,但很难找到一个可行的例子。

【问题讨论】:

    标签: c# jquery asp.net sql-server jquery-datatables


    【解决方案1】:

    在 C#、ASP.NET、使用 ajax 和 web 服务的 SQL Server 端处理中的 JQuery DataTables 的工作示例。

    http://jquerydatatablessamp.codeplex.com/

    https://github.com/benni12/jquerydatatablesExample

    (发了两次,方便大家找)

    从链接到 DataTables.Net 开始,Allan 用这个插件做了一个了不起的工作。

    我已经使用这个插件大约一年了。当我第一次尝试在 C# 和 .NET 中使用服务器端处理、ajax 和 web 服务来实现它时,文档很少,也没有工作示例,所以我决定将它们放在一起。

    提供的源代码是 Visual Studio 2012(在 Ultimate 2012 和 Pro 2012 中测试)网站项目。我把它作为一个简单的工作示例放在一起,希望能帮助其他人尝试把这样的东西放在一起。这是我希望一年前拥有的东西。

    数据库 mdf 包含在 App_Data 文件夹中。我目前正在运行 MS SQL Server Express 2012 的实例。

    需要安装 SQL Server Express 2012 或其他标准或更好的 MS SQL Server 完整版安装。在标准 2008 R2 和 2012 Express 上测试。

    【讨论】:

    • 在 vs 中用户使用哪个版本?
    • 这个打不开请提供其他版本,我会用VS2010 Ultimate
    • @user108 好的,2010 版本现在可在 GitHub 和 Codeplex 链接上使用。内置专业版。希望这对你有用。告诉我进展如何。
    • yes 是打开的,但是当我搜索时给我错误Invalid value for key 'attachdbfilename'.
    • @user108 好的,经过一番谷歌搜索后,似乎 SQL Server 2010 express 不支持在解决方案中附加数据库(forums.asp.net/t/966680.aspx/1)...但是好消息是,SQL Server 2012 express 可以。这就是我在我的开发机器上运行的,所以如果你能抓住这个,你应该很高兴。 microsoft.com/en-us/download/details.aspx?id=29062
    【解决方案2】:

    此版本适用于旧版本的 SqlServer,对于较新版本,请尝试其他版本。

    此技术使用存储过程,您可以使用#temp 以外的其他方法来提高性能 主要特点是

    • 存储过程
    • 免注入且易于适应的 sql 结构
    • 阿贾克斯

    功能强大且非常有用

    第 1 步:(HTML)

     <link href="../Content/css/datatables.min.css" rel="stylesheet" />
     <script src="../Scripts/datatables.min.js"></script>
     <script src="../Scripts/jQuery-2.1.4.min.js"></script>
    
     <script>
     $(document).ready(function () {
          if ($.fn.dataTable.isDataTable('#tbl_category')) {
            t.destroy();
        }
        t = $("#tbl_category").DataTable({
            processing: true,
            serverSide: true,
            info: true,
            ajax: {
                url: '../Ajax/Category?option=GetAllAdminCategory&user_srno='+user_srno,
                data: function (data) {
                    delete data.columns;
                }
            },
            columns: [
                        { "data": "abc" },
                        { "data": "name" },
                        { "data": "baseDiscount" },
                        { "data": "additionalDiscount" },
                        { "data": "specialDiscount" },
                        {
                            "render": function (data, type, full, meta) {
                                return '<a class="btn btn-warning" onClick="editdata(' + full.srno + ',\'' + full.name + '\',\'' + full.baseDiscount + '\',\'' + full.additionalDiscount + '\',\'' + full.specialDiscount + '\',\'' + full.specialDiscount + '\')" href="javascript://">Edit</a>&nbsp;&nbsp;<a class="btn btn-danger" onClick="deletePhantom(' + full.srno + ',\'DELETE\')" href="javascript://">Remove</a>';
                            }
                        }
            ],
            order: [[0, 'desc']],
            select: true,
            dom: 'lfrtip',
            responsive: true,
            buttons: true
        });
        t.on('order.dt search.dt', function () {
            t.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) {
                cell.innerHTML = i + 1;
            });
        }).draw();
    
    });
     </script>
    
     <table id="tbl_category" class="display" cellspacing="0" width="100%">
                            <thead>
                                <tr>
                                    <th>#</th>
                                    <th>Name</th>
                                    <th>Base Discount</th>
                                    <th>Additional Discount</th>
                                    <th>Special Discount</th>
                                    <th>Action</th>
                                </tr>
                            </thead>
                            <tfoot>
                                <tr>
                                    <th>#</th>
                                    <th>Name</th>
                                    <th>Base Discount</th>
                                    <th>Additional Discount</th>
                                    <th>Special Discount</th>
                                    <th>Action</th>
                                </tr>
                            </tfoot>
                        </table>
    

    STEP :2(存储过程)

    Create procedure [dbo].[category_post]
     @srno int=null, -- from here 
     @user_srno int=null,
     @catSrno int=null,
     @name varchar(200)=null,
     @baseDiscount numeric(18,2)=null,
     @additionalDiscount numeric(18,2)=null,
     @specialDiscount numeric(18,2)=null,
     @status int null,
     @Action_by int null,
     @option varchar(20) = null, -- to here personnel parameters
     @orderColumn  int =null, 
     @orderDir  varchar(20)=null,
     @start  int =null,
     @limit  int =null,
     @searchKey varchar(20) -- personnel parameter
      as 
      BEGIN
    
    
    
        select IDENTITY(int,1,1) as SnoID, null as abc,specialDiscount, additionalDiscount, baseDiscount, name,cast(srno as varchar(20)) as srno
                --this method is userful for all sql server version (it can be made better by using fetch)
        into #tempCategory
         from categoryStd where [status] not in(4,14) and categoryStd.name like '%'+@searchKey+'%'
    
        declare @to as int = @start+@limit  
    
         select * from #tempCategory where SnoID>@start and SnoID<=@to
    
            order by
                        CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN #tempCategory.[name] END DESC,
                        CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN #tempCategory.[name] END ASC,
                        CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN #tempCategory.[name] END DESC,
                        CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN #tempCategory.[name] END ASC
    
    
    
            select count(*) from #tempCategory
    
    
    END
    

    STEP:3(AJAX 页面)C# 表单

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Configuration;
    using AppBlock;
    using System.Data.SqlClient;
    using Newtonsoft.Json;
    
    namespace alfest.Ajax
    {
      public partial class Category : System.Web.UI.Page
      {
        string mode, option, user, limit, start, searchKey, orderByColumn, orderByDir, estMstSrno, pnlsrno, draw, jsonString;
        CommonClass cmnCls = new CommonClass();
        protected void Page_Load(object sender, EventArgs e)
        {
          mode = Request.QueryString["mode"] == null ? "" : Request.QueryString["mode"].ToString();
          option = Request.QueryString["option"] == null ? "" : Request.QueryString["option"].ToString();
          limit = Request.QueryString["length"] == null ? "" : Request.QueryString["length"].ToString();
          start = Request.QueryString["start"] == null ? "" : Request.QueryString["start"].ToString();
          user = Request.QueryString["user"] == null ? "" : Request.QueryString["user"].ToString();
          searchKey = Request.QueryString["search[value]"] == null ? "" : Request.QueryString["search[value]"].ToString();
          orderByColumn = Request.QueryString["order[0][column]"] == null ? "" : Request.QueryString["order[0][column]"].ToString();
          orderByDir = Request.QueryString["order[0][dir]"] == null ? "" : Request.QueryString["order[0][dir]"].ToString();
          estMstSrno = Request.QueryString["estMstSrno"] == null ? "" : Request.QueryString["estMstSrno"].ToString();
          pnlsrno = Request.QueryString["pnlsrno"] == null ? "" : Request.QueryString["pnlsrno"].ToString();
          draw = Request.QueryString["draw"] == null ? "" : Request.QueryString["draw"].ToString();
    
    
    
           // Cls_Category CatgObj = new Cls_Category();
           // CatgObj.orderColumn = Convert.ToInt32(orderByColumn);
           // CatgObj.limit = Convert.ToInt32(limit);
           // CatgObj.orderDir = orderByDir;
           // CatgObj.start = Convert.ToInt32(start);
           // CatgObj.searchKey = searchKey;
           // CatgObj.option = "GetAllAdminCategory";
    
          // or user your own method to get data (just fill the dataset)
    
          //  DataSet ds = cmnCls.PRC_category(CatgObj);
    
            dynamic newtonresult = new
              {
                status = "success",
                draw = Convert.ToInt32(draw == "" ? "0" : draw),
                recordsTotal = ds.Tables[1].Rows[0][0],
                recordsFiltered = ds.Tables[1].Rows[0][0],
                data = ds.Tables[0]
              };
            jsonString = JsonConvert.SerializeObject(newtonresult);
    
            Response.Clear();
            Response.ContentType = "application/json";
            Response.Write(jsonString);
    
        }
      }
    }
    

    最终结果:

    【讨论】:

    • 我谦虚地请求更多的 cmets 解释代码,如果可能的话.. 如果提供,我很乐意投票
    • dom:'lfrtip' 是什么意思?
    • @Malky.Kid 是搜索框、状态、分页按钮,是它的表示和顺序。
    • 好的,但是如果我要求对代码的使用方式进行评论可以吗?我真的很感激
    【解决方案3】:

    在 MVC、实体框架、带有最新获取偏移分页的存储过程中的实现

    第 1 步 - HTML

    <table id="tbl_category" class="display" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>#</th>
                <th>Name</th>
                <th>Base Discount</th>
                <th>Additional Discount</th>
                <th>Special Discount</th>
                <th>Action</th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <th>#</th>
                <th>Name</th>
                <th>Base Discount</th>
                <th>Additional Discount</th>
                <th>Special Discount</th>
                <th>Action</th>
            </tr>
        </tfoot>
    </table>
    
    @*<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs/dt-1.10.13/r-2.1.1/sc-1.4.2/datatables.min.css" />
    
    <script type="text/javascript" src="https://cdn.datatables.net/v/bs/dt-1.10.13/r-2.1.1/sc-1.4.2/datatables.min.js"></script>*@
    <link href="~/Scripts/JqueryDatatable/Datatable.css" rel="stylesheet" />
    <script src="~/Scripts/JqueryDatatable/DataTable.js"></script>
    
    <script>
    $(document).ready(function() {
    
        if ($.fn.dataTable.isDataTable('#tbl_category')) {
            t.destroy();
        }
        t = $("#tbl_category").DataTable({
            processing: true,
            serverSide: true,
            info: true,
            ajax: {
                url: '../Client/SearchMis',
                data: function (data) {
                    delete data.columns;
                }
            },
            scrollY:        300,
            deferRender:    true,
            scroller:       true,
            columns: [
                        { "data": "abc" },
                        { "data": "name" },
                        { "data": "Address" },
                        { "data": "name" },
                        { "data": "name" },
                        {
                            "render": function (data, type, full, meta) {
                                return '<a class="btn btn-warning" onClick="editdata(' + full.name + ',\'' + full.name + '\',\'' + full.name + '\',\'' + full.name + '\',\'' + full.name + '\',\'' + full.name + '\')" href="javascript://">Edit</a>&nbsp;&nbsp;<a class="btn btn-danger" onClick="deletePhantom(' + full.name + ',\'DELETE\')" href="javascript://">Remove</a>';
                            }
                        }
            ],
            order: [[0, 'desc']],
            select: true,
            dom: 'lfrtip',
            responsive: true,
            buttons: true
        });
        t.on('order.dt search.dt', function () {
            t.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) {
                cell.innerHTML = i + 1;
            });
        }).draw();
    
    });
    </script>
    

    第 2 步 - C#

    using EmployeeTrackingSystemAndMIS.Models;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web.Mvc;
    
    namespace EmployeeTrackingSystemAndMIS.Controllers
    {
        public class ClientController : Controller
        {
            private EmployeeTrackingSystemAndMISEntities db = new EmployeeTrackingSystemAndMISEntities();
    
            public string SearchMis()
            {
                string limit, start, searchKey, orderColumn, orderDir, draw, jsonString;
                limit = Request.QueryString["length"] == null ? "" : Request.QueryString["length"].ToString();
                start = Request.QueryString["start"] == null ? "" : Request.QueryString["start"].ToString();
                searchKey = Request.QueryString["search[value]"] == null ? "" : Request.QueryString["search[value]"].ToString();
                orderColumn = Request.QueryString["order[0][column]"] == null ? "" : Request.QueryString["order[0][column]"].ToString();
                orderDir = Request.QueryString["order[0][dir]"] == null ? "" : Request.QueryString["order[0][dir]"].ToString();
                draw = Request.QueryString["draw"] == null ? "" : Request.QueryString["draw"].ToString();
    
    
                var parameter = new List<object>();
                var param = new SqlParameter("@orderColumn", orderColumn);
                parameter.Add(param);
                param = new SqlParameter("@limit", limit);
                parameter.Add(param);
                param = new SqlParameter("@orderDir", orderDir);
                parameter.Add(param);
                param = new SqlParameter("@start", start);
                parameter.Add(param);
                param = new SqlParameter("@searchKey", searchKey);
                parameter.Add(param);
    
                var CompanySearchList = db.Database.SqlQuery<CompanySearch>("EXEC SearchCompany @orderColumn,@limit,@orderDir,@start,@searchKey ", parameter.ToArray()).ToList();
    
                dynamic newtonresult = new
                {
                    status = "success",
                    draw = Convert.ToInt32(draw == "" ? "0" : draw),
                    recordsTotal = CompanySearchList.FirstOrDefault().TotalCount,
                    recordsFiltered = CompanySearchList.FirstOrDefault().TotalCount,
                    data = CompanySearchList
                };
                jsonString = JsonConvert.SerializeObject(newtonresult);
    
                return jsonString;
            }
    
            private class CompanySearch
            {
                public int TotalCount { get; set; }
                public string abc { get; set; }
                public string Address { get; set; }
                public int? ClientID { get; set; }
                public int? EmployeeID { get; set; }
                public string name { get; set; }
                public int CompanyID { get; set; }
            }
        }
    }
    

    第 3 步 - 存储过程

    USE [EmployeeTrackingSystemAndMIS]
    GO
    /****** Object:  StoredProcedure [dbo].[category_post]    Script Date: 22-02-2017 10:57:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    alter  procedure [dbo].SearchCompany
    
    @orderColumn  int ,
    @limit  int,
    @orderDir  varchar(20),
    @start  int,
    @searchKey varchar(20)
      as 
      BEGIN
    
         declare @to as int = @start+@limit  
    
        select TotalCount = COUNT(c.CompanyID) OVER(), null as abc,c.Address,c.ClientID ,c.EmployeeID  , name,
        c.CompanyID 
    
    
         from CompanyTbl c  where c.Name like '%'+@searchKey+'%'
    
            order by
                        CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN c.[name] END DESC,
                        CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN c.[name] END ASC,
                        CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN c.[name] END DESC,
                        CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN c.[name] END ASC
    
    
                        OFFSET @start ROWS
                                  FETCH NEXT @to ROWS ONLY
    
      End       
    

    【讨论】:

    • 我的 Request.QueryString 值总是空的...有什么想法吗?
    • @Murphybro2 你用的是哪个 .net 版本,是 mvc、asp.net、.net core。
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 2011-04-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多