带有 MVC 5 和实体框架的 jQuery 数据表

Posted

技术标签:

【中文标题】带有 MVC 5 和实体框架的 jQuery 数据表【英文标题】:jQuery Datatable with MVC 5 and Entity Framework 【发布时间】:2014-04-23 08:20:17 【问题描述】:

我需要一些关于在我的控制器中放入什么的指导,以便我可以将服务器端处理与我的 jQuery 数据表一起使用。我正在使用 MVC 5 和实体框架。

http://datatablesmvc.codeplex.com/documentation 的示例说明如下:

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

但是当我使用这样的 LINQ 时我该怎么办?

 public ActionResult Index()
         
           var activity = db.Activity.Include(a => a.ActivityType);
              return View(activity.ToList());
          

【问题讨论】:

【参考方案1】:

------------------- 更新答案 -------------- -----------------

为什么要更新?

这个答案似乎一直受到 SO 用户的广泛关注,我认为每个人都可以从“小”更新中受益。

到目前为止发生了什么变化?

DataTables.Mvc 一年多前开始。它已更改,现在称为DataTables.AspNet。但这还不是全部。

当时,目标是帮助基类。问题是您只需要一个 zip 文件,并且应该手动将所有内容合并到您的项目中。此外,模型没有绑定器,集成真的很无聊。

现在我们有了一个带有 Nuget 包的模块化架构来提供帮助。您可以参考Core 包并自己实现所有内容,或者您​​可以获得适当的包(Mvc5AspNetWebApi2 即将推出)带有原生模型绑定器、单行注册和完整的测试套件。

如何开始?

查看 dev 分支 (click here) 上的 samples 文件夹。 不要忘记获取适当的 Nuget 包。你可以找到他们的名单here。

------------------ 原始答案 -------------- -----------------

首要任务

您可以将 DataTables 1.9、1.10 与旧 API 或 1.10 与新 API 一起使用。

如果您选择新的 API(仅限 1.10),那么您会到处错过一些插件,但您可以使用 DataTables.AspNet on GitHub 来帮助绑定。

如果没有,您可以查看并更改代码以匹配其他版本的请求变量(稍后将在我的项目中提供支持)。

真正的交易

重点是你必须处理三个项目:

    全局过滤/搜索 列过滤/搜索 列排序

给我一些代码!

如果您使用(或不使用)我的绑定类,这可能会从哪个版本改变。考虑到你在使用它,为了避免在这里处理请求参数,好吗?

所以,你可以这样玩:

[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);

【讨论】:

我在 datatables.net 的博客上看到了这个,它看起来非常好。你有动态 linq 的例子吗? 抱歉,还没有。我将在今天/明天继续工作,并尽快提供。但是,应该很简单:创建某种帮助器/扩展来接收列集合并返回带有过滤器或排序的字符串并将其传递给 Dynamic Linq。 只是在玩它一点,我认为它不适用于我正在采用的方法,因为 IModelBinder 接口不适用于 ApiControllers。我不认为你有替代/补丁的建议? 这里最好考虑供应商,而不是单独的项目【参考方案2】:

使用EFDatatable

什么是EFDatatable?

EFDatatable 是使用 Jquery Datatable 创建网格的助手,并提供了从实体框架上下文中检索数据的扩展。可以通过 html 助手使用许多 datatable.js 功能。它提供服务器端或客户端选项。还有更多:Wiki Documentation

@(Html.EF().Datatable<Person>()
        .Name("PersonGrid")
        .Columns(cols =>
        
            cols.Field(a => a.Id).Visible(false);
            cols.Field(a => a.Name).Title("First Name").Class("text-danger");
            cols.Field(a => a.Age).Title("Age").Searchable(false);
            cols.Field(a => a.BirthDate).Title("Birth Date").Format("DD-MMM-Y");
            cols.Command(a => a.Id, "onClick", text: "Click").Title("");
        )
        .Filters(filter =>
        
            filter.Add(a => a.Id).GreaterThanOrEqual(1);
        )
        .URL(Url.Action("GetDataResult"), "POST")
        .ServerSide(true)
        .Render()
)

通过“ToDataResult(request)”扩展功能,可以非常简单的通过服务端分页获取数据。

public JsonResult GetDataResult(DataRequest request)
    
        DataResult result = context.People.ToDataResult(request);
        return Json(result);
    

在哪里可以买到?

从包管理器控制台安装EFDatatable:

PM> Install-Package EFDatatable

然后将datatables.net javascript 和CSS 文件或链接添加到您的项目。

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.js"></script>

【讨论】:

以上是关于带有 MVC 5 和实体框架的 jQuery 数据表的主要内容,如果未能解决你的问题,请参考以下文章

不使用实体框架的 MVC 架构

带有实体框架和 SQL Server 数据库的 ASP.NET MVC - 图像未显示在视图中......错误显示“无法将“字节”转换为“字符串”

带有实体框架的 MVC 下拉列表

带有实体框架的 ASP.NET MVC Core 项目中的种子角色

使用带有实体框架代码优先和 ASP.NET MVC 3 和 mvc miniprofiler 的 SQL Server CE 时出现问题

在 MVC 5 中使用实体框架