当前位置: 代码迷 >> JavaScript >> 使用WEB API OData服务自定义DataTable以过滤EF-列搜索不起作用
  详细解决方案

使用WEB API OData服务自定义DataTable以过滤EF-列搜索不起作用

热度:72   发布时间:2023-06-06 09:36:17.0

我在客户端使用DataTables,在服务器端使用ASP.NET WEB API OData可查询服务。 服务器端对DataTable列进行排序和过滤的问题是,即使不将DataTables用于排序或过滤,DataTables也会使用所有列信息生成可怕的超长请求。 我决定编写从客户端到服务器的自定义AJAX调用,以创建简洁的odata查询,该查询可轻松应用于EF上下文。 不幸的是,列搜索字段已停止呈现为输入。 可能是什么问题?

JavaScript和HTML代码:

 $(document).ready(function() { var options = new Object(); options.searching = true; options.searchable = true; options.aoColumns = [{ "sName": "USER_NAME", "searchable": true }]; options.bProcessing = true; options.bServerSide = true; options.sAjaxSource = "http://localhost/api/list"; options.fnServerData = function(sSource, aoData, fnCallback) { var filter = "$top=5"; //just as example $.getJSON(sSource, filter, function(json) { fnCallback(json); }); } $('#myTable').dataTable(options); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="//cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script> <table id="myTable" class="table"> <thead> <tr> <th> First Name </th> ... </tr> </thead> <tfoot> <tr> <th> First Name </th> ... </tr> </tfoot> </table> 

该服务运行良好,看起来像这样(我使此代码尽可能容易理解)。 C#代码:

public HttpResponseMessage List(ODataQueryOptions<User> options)
{
    var result = oDataQueryOptions.ApplyTo(_context.Users) as IEnumerable<User>;
    JQueryJsonResponse jsonUserResult = new JQueryJsonResponse
    {
        Draw = xxx,
        iTotalRecords = xxx,
        iTotalDisplayRecords = xxx,
        aaData = result.ToList()
    };
    return Request.CreateResponse(HttpStatusCode.OK, jsonUserResult);
}

我期望这样的事情: 但是我得到这个:

原因

您已通过options.bServerSide = true;启用了服务器端处理模式options.bServerSide = true; 在服务器端处理模式过滤中,分页和排序计算均由服务器执行。

您需要处理客户端在服务器上发送的参数,并执行过滤,分页和排序。 查看在服务器端处理模式下发送 。

另一种解决方案是使用options.bServerSide = false;禁用服务器端处理模式options.bServerSide = false; 并让DataTables在客户端执行过滤,分页和排序。

好的,这个问题格式不好,抱歉。 我的意思是,我想对我的数据表应用列搜索。 在其他表的复制粘贴阶段,我只是错过了一些代码行。 我添加了类似的内容,现在可以正常工作了!

 // Setup 'Search' var filterSelector = '#myTable' + ' tfoot th'; $(filterSelector).each(function() { var searchbox = $(this); searchbox.html('<input type="text" class="form-control" placeholder="Search" />'); }); //Apply DataTables var table = $('#myTable').DataTable(options); $('.dataTables_filter input').attr("placeholder", "Search"); // Apply generic search table.columns().every(function() { var that = this; var thatFooter = $('input', this.footer()); thatFooter.on('keyup change', function() { that.search(this.value).draw(); }); }); 

  相关解决方案