Ajax 使用MVC5和实体框架的jQuery数据表
我需要一些关于在控制器中放置什么的指导,这样我就可以对jQuery数据表使用服务器端处理。我正在使用MVC5和实体框架 位于的示例说明了以下内容:Ajax 使用MVC5和实体框架的jQuery数据表,ajax,asp.net-mvc,linq,entity-framework,datatables,Ajax,Asp.net Mvc,Linq,Entity Framework,Datatables,我需要一些关于在控制器中放置什么的指导,这样我就可以对jQuery数据表使用服务器端处理。我正在使用MVC5和实体框架 位于的示例说明了以下内容: public class HomeController : Controller { [HttpPost] public ActionResult GetDataTables(DataTable dataTable) { List<List<string>> table = new List<List<str
public class HomeController : Controller {
[HttpPost]
public ActionResult GetDataTables(DataTable dataTable) {
List<List<string>> table = new List<List<string>>();
//Do something with dataTable and fill table
return new DataTableResult(dataTable, table.Count, table.Count, table);
}
}
-------------------------------最新答案-------------------------------
为什么要更新?
这个答案似乎一直受到用户的关注,所以我认为每个人都可以从一个“小”更新中受益
到目前为止发生了什么变化?
DataTables.Mvc
始于一年多前。它已更改,现在称为DataTables.AspNet
。但这还不是全部
当时,目标是帮助基类。问题是,您刚刚得到一个zip文件,应该手动将所有这些文件合并到您的项目中。而且,没有用于模型的活页夹,集成非常枯燥
现在,我们有了一个模块化的体系结构和Nuget软件包来提供帮助。您可以参考Core
包并自己实现所有功能,也可以使用本机模型绑定、一行注册和完整测试套件获得合适的包(Mvc5
或AspNet
;WebApi2
即将推出)
如何开始?
查看dev
branch()上的samples
文件夹。
别忘了带上合适的Nuget软件包。你可以找到它们的列表
-------------------------------原始答案-------------------------------
第一件事
您可以将DataTables 1.9、1.10与旧API一起使用,也可以将DataTables 1.10与新API一起使用
如果您选择了新的API(仅1.10版),您将错过一些插件,但您可以使用它来帮助绑定
如果没有,您可以查看并更改代码以匹配其他版本的请求变量(稍后将在我的项目中提供支持)
真正的交易
重点是,您必须处理三项:
[HttpPost]
public ActionResult Index([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestParameters)
{
var totalCount = myDbContext.Set<Something>().Count();
var filteredDataSet = myDbContext.Set<Something>().Where(_s => _s.ToLower().Contains(requestParameters.Search.Value));
foreach(var column in requestParameters.Columns.GetFilteredColumns())
{
// Apply individual filters to each column.
// You can try Dynamic Linq to help here or you can use if statements.
// DynamicLinq will be slower but code will be cleaner.
}
var isSorted = false;
IOrderedEnumerable<Something> ordered = null;
foreach(var column in requestParameters.Columns.GetSortedColumns())
{
// If you choose to use Dynamic Linq, you can apply all sorting at once.
// If not, you have to apply each sort manually, as follows.
if (!isSorted)
{
// Apply first sort.
if (column.SortDirection == Column.SortDirection.Ascendant)
ordered.OrderBy(...);
else
ordered.OrderByDescending(...);
isSorted = true;
}
else
{
if (column.SortDirection == Column.SortDirection.Ascendant)
ordered.ThanBy(...);
else
ordered.ThanByDescending(...);
}
}
var pagedData = ordered.Skip(requestParameters.Start).Take(requestParameters.Length);
var dataTablesResult = new DataTablesResult(
requestParameters.Draw,
pagedData,
filteredDataSet.Count(),
totalCount
);
return View(dataTablesResult);
}
[HttpPost]
公共操作结果索引([ModelBinder(typeof(DataTableBinder))]IDataTablesRequestParameters)
{
var totalCount=myDbContext.Set().Count();
var filteredataset=myDbContext.Set()。其中(_s=>_s.ToLower().Contains(requestParameters.Search.Value));
foreach(requestParameters.Columns.GetFilteredColumns()中的var列)
{
//对每列应用单个筛选器。
//您可以尝试使用动态Linq来提供帮助,也可以使用if语句。
//DynamicLinq会更慢,但代码会更干净。
}
var isSorted=false;
IORDerenumerable ordered=null;
foreach(requestParameters.Columns.GetSortedColumns()中的var列)
{
//如果选择使用动态Linq,则可以一次应用所有排序。
//如果没有,则必须手动应用每个排序,如下所示。
如果(!isSorted)
{
//应用第一类。
if(column.SortDirection==column.SortDirection.Ascendant)
订购人(…);
其他的
ordered.OrderByDescending(…);
isSorted=true;
}
其他的
{
if(column.SortDirection==column.SortDirection.Ascendant)
命令。ThanBy(…);
其他的
有序。通过降序(…);
}
}
var pagedData=ordered.Skip(requestParameters.Start).Take(requestParameters.Length);
var dataTablesResult=新的dataTablesResult(
请求参数。绘制,
pagedData,
filteredDataSet.Count(),
总数
);
返回视图(dataTablesResult);
}
使用
什么是EFDatatable?
EFDatatable是使用Jquery Datatable创建网格的助手,并提供了一个扩展,用于从实体框架上下文中检索数据。可以将许多datatable.js功能与Html帮助器一起使用。它提供服务器端或客户端选项。还有更多:
@(Html.EF().Datatable())
.姓名(“PersonGrid”)
.Columns(cols=>
{
cols.Field(a=>a.Id).Visible(false);
cols.Field(a=>a.Name).Title(“名字”).Class(“文本危险”);
cols.Field(a=>a.Age).Title(“Age”)。可搜索(false);
cols.字段(a=>a.BirthDate).Title(“BirthDate”).Format(“DD-MMM-Y”);
命令(a=>a.Id,“onClick”,文本:“Click”).Title(“”);
})
.Filters(filter=>
{
filter.Add(a=>a.Id).GreaterThanOrEqual(1);
})
.URL(URL.Action(“GetDataResult”),“POST”)
.ServerSide(true)
.Render()
)
使用“ToDataResult(request)”扩展功能,可以非常简单地通过服务器端分页获取数据
公共JsonResult GetDataResult(DataRequest请求)
{
DataResult=context.People.ToDataResult(请求);
返回Json(结果);
}
在哪里可以买到?
从软件包管理器控制台安装:
PM> Install-Package EFDatatable
然后将Javascript和CSS文件或链接添加到项目中
我在的博客上看到了这个,看起来真的很不错。你有动态linq的例子吗?对不起,还没有。我将在今天/明天完成这项工作,并尽快提供。但是,应该非常简单:创建某种帮助程序/扩展来接收列集合,并返回一个带有筛选器或sort的字符串,然后将其传递给Dynamic Linq。只是对它进行了更多的处理,我认为它不会与我所采用的方法一起工作,因为IModelBinder接口不会与Apicontroller一起工作。我不认为你有一个替代/补丁的建议?好的想法,为供应商在这里,而不是seprate项目
PM> Install-Package EFDatatable