65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET8 使用 DataTables.net – 第2部分 – 操作按钮

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2024 年 7 月 11 日

CPOL

3分钟阅读

viewsIcon

14294

downloadIcon

199

在 Asp.Net 8 MVC 应用程序中使用 jQuery DataTables.net 组件的实用指南。

1 ASP.NET8 使用 jQuery DataTables.net

我正在评估 jQuery DataTables.net 组件 [1] 在 ASP.NET8 项目中的使用,并创建了几个 原型(概念验证)应用程序,这些应用程序将在这些文章中展示。

 

1.1 本系列文章

本系列文章包括:

  • ASP.NET8 使用 DataTables.net – 第1部分 – 基础
  • ASP.NET8 使用 DataTables.net – 第2部分 – 操作按钮
  • ASP.NET8 使用 DataTables.net – 第3部分 – 状态保存
  • ASP.NET8 使用 DataTables.net – 第4部分 – 多语言
  • ASP.NET8 使用 DataTables.net – 第5部分 – 在 AJAX 中传递附加参数
  • ASP.NET8 使用 DataTables.net – 第6部分 – 在 AJAX 中返回附加参数
  • ASP.NET8 使用 DataTables.net – 第7部分 – 常规按钮
  • ASP.NET8 使用 DataTables.net – 第8部分 – 选择行
  • ASP.NET8 使用 DataTables.net – 第9部分 – 高级筛选器

 

2 最终结果

本文的目标是创建一个概念验证应用程序,演示带有附加操作的 操作按钮。 操作按钮调用操作并将特定的行 ID 传递给该操作。 让我们展示一下本文的结果。

 

 

本文的主题是如何在 DataTables 组件内部创建按钮以及如何将行 ID 传递给操作。

3 客户端 DataTables.net 组件

在这里,我将只展示使用 DataTables 组件的 ASP.NET 视图的样子。

<!-- Employees.cshtml -->
<partial name="_LoadingDatatablesJsAndCss" />

@{
    <div class="text-center">
        <h3 class="display-4">Employees table</h3>
    </div>

    <!-- Here is our table HTML element defined. JavaScript library Datatables
    will do all the magic to turn it into interactive component -->
    <table id="EmployeesTable01" class="table table-striped table-bordered ">
    </table>
}


<script>
    // Datatables script initialization=========================================
    // we used defer attribute on jQuery so it might not be available at this point
    // so we go for vanilla JS event

    document.addEventListener("DOMContentLoaded", InitializeDatatable);

    function InitializeDatatable() {
        $("#EmployeesTable01").dataTable({
            //processing-Feature control the processing indicator.
            processing: true,
            //paging-Enable or disable table pagination.
            paging: true,
            //info-Feature control table information display field
            info: true,
            //ordering-Feature control ordering (sorting) abilities in DataTables.
            ordering: true,
            //searching-Feature control search (filtering) abilities
            searching: true,
            //search.return-Enable / disable DataTables' search on return.
            search: {
                return: true
            },
            //autoWidth-Feature control DataTables' smart column width handling.
            autoWidth: true,
            //lengthMenu-Change the options in the page length select list.
            lengthMenu: [10, 15, 25, 50, 100],
            //pageLength-Change the initial page length (number of rows per page)
            pageLength: 15,

            //order-Initial order (sort) to apply to the table.
            order: [[1, 'asc']],

            //serverSide-Feature control DataTables' server-side processing mode.
            serverSide: true,

            //Load data for the table's content from an Ajax source.
            ajax: {
                "url": "@Url.Action("EmployeesDT", "Home")",
                "type": "POST",
                "datatype": "json"
            },

            //Set column specific initialisation properties
            columns: [
                //name-Set a descriptive name for a column
                //data-Set the data source for the column from the rows data object / array
                //title-Set the column title
                //orderable-Enable or disable ordering on this column
                //searchable-Enable or disable search on the data in this column
                //type-Set the column type - used for filtering and sorting string processing
                //visible-Enable or disable the display of this column.
                //width-Column width assignment.
                //render-Render (process) the data for use in the table.
                //className-Class to assign to each cell in the column.

                {   //0
                    name: 'id',
                    data: 'id',
                    title: "Employee Id",
                    orderable: true,
                    searchable: false,
                    type: 'num',
                    visible: true
                },
                {
                    //1
                    name: 'givenName',
                    data: "givenName",
                    title: "Given Name",
                    orderable: true,
                    searchable: true,
                    type: 'string',
                    visible: true
                },
                {
                    //2
                    name: 'familyName',
                    data: "familyName",
                    title: "Family Name",
                    orderable: true,
                    searchable: true,
                    type: 'string',
                    visible: true
                },
                {
                    //3
                    name: 'town',
                    data: "town",
                    title: "Town",
                    orderable: true,
                    searchable: true,
                    type: 'string',
                    visible: true
                },
                {
                    //4
                    name: 'country',
                    data: "country",
                    title: "Country",
                    orderable: true,
                    searchable: true,
                    type: 'string',
                    visible: true,
                    width: "150px",
                    className: 'text-center '
                },
                {
                    //5
                    name: 'email',
                    data: "email",
                    title: "Email",
                    orderable: true,
                    searchable: true,
                    type: 'string',
                    visible: true
                },
                {
                    //6
                    name: 'phoneNo',
                    data: "phoneNo",
                    title: "Phone Number",
                    orderable: false,
                    searchable: true,
                    type: 'string',
                    visible: true
                },
                {
                    //7
                    name: 'actions',
                    data: "actions",
                    title: "Actions",
                    orderable: false,
                    searchable: false,
                    type: 'string',
                    visible: true,
                    render: renderActions
                },
                {
                    //8
                    name: 'urlForEdit',
                    data: "urlForEdit",
                    title: "urlForEdit",
                    orderable: false,
                    searchable: false,
                    type: 'string',
                    visible: false
                }
            ]
        });

        function renderActions(data, type, row, meta) {
            //for Edit button we get Url from the table data
            let html1 =
                '<a class="btn btn-info" href="' +
                row.urlForEdit + '">Edit</a>';

            //for Info button we create Url in JavaScript
            let infoUrl = "@Url.Action("EmployeeInfo", "Home")" +
                "?EmployeeId=" + row.id;
            let html2 =
                '<a class="btn btn-info"  style="margin-left: 10px" href="' +
                infoUrl + '">Info</a>';

            return html1 + html2;
        }
    }
</script>

请注意“actions”列中的“render”属性。 那里是按钮渲染被调用的地方。
我们展示了两种创建操作 URL 的方法

  1. 在服务器端创建带 ID 的 URL(编辑按钮)
  2. 在客户端创建带 ID 的 URL(信息按钮)

有时,在服务器端使用 C# 工具创建复杂的 URL 可能更方便,在那里可以获得更多数据。 然后我们使用一个技巧,将其作为表列“urlForEdit”(不可见)传递给客户端组件。 这显示在“编辑”按钮中。

当然,如果您喜欢 JavaScript,也可以在客户端创建 URL。 这显示在“信息”按钮中。

 

4 ASP.NET 后端处理

我们现在可以看看服务器端,在那里进行处理。 新的内容只是我们如何创建 urlForEdit 并将其传递给客户端。

//HomeController.cs

 //this is target of AJAX call and provides data for
 //the table, based on selected input parameters
 public IActionResult EmployeesDT(DataTables.AspNet.Core.IDataTablesRequest request)
 {
     // There is dependency in this method on names of fields
     // and implied mapping. I see it almost impossible to avoid.
     // At least, in this method, we avoided dependency on the order
     // of table fields, in case order needs to be changed
     //Here are our mapped table columns:
     //Column0 id -> Employee.Id
     //Column1 givenName -> Employee.FirstName
     //Column2 familyName -> Employee.LastName
     //Column3 town -> Employee.City
     //Column4 country -> Employee.Country
     //Column5 email -> Employee.Email
     //Column6 phoneNo -> Employee.Phone
     //Column7 actions 
     //Column8 urlForEdit 

     try
     {
         IQueryable<Employee> employees = MockDatabase.MockDatabase.Instance.EmployeesTable.AsQueryable();

         int totalRecordsCount = employees.Count();

         var iQueryableOfAnonymous = employees.Select(p => new
         {
             id = p.Id,
             givenName = p.FirstName,
             familyName = p.LastName,
             town = p.City,
             country = p.Country,
             email = p.Email,
             phoneNo = p.Phone,
         });

         iQueryableOfAnonymous = FilterRowsPerRequestParameters(iQueryableOfAnonymous, request);

         int filteredRecordsCount = iQueryableOfAnonymous.Count();

         iQueryableOfAnonymous = SortRowsPerRequestParamters(iQueryableOfAnonymous, request);

         iQueryableOfAnonymous = iQueryableOfAnonymous.Skip(request.Start).Take(request.Length);

         var dataPage = iQueryableOfAnonymous.ToList();
         var dataPage2 = dataPage.Select(p => new
         {
             p.id,
             p.givenName,
             p.familyName ,
             p.town ,
             p.country ,
             p.email ,
             p.phoneNo ,
             actions = System.String.Empty,
             urlForEdit = Url.Action("EmployeeEdit", "Home", new { EmployeeId = p.id }),
         }).ToList();

         var response = DataTablesResponse.Create(request, totalRecordsCount, filteredRecordsCount, dataPage2);

         return new DataTablesJsonResult(response, false);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
         var response = DataTablesResponse.Create(request, "Error processing AJAX call on server side");
         return new DataTablesJsonResult(response, false);
     }
 }

 

5 结论

可以下载完整的示例代码项目。

 

6 参考资料

[1] https://datatables.net.cn/

[21] ASP.NET8 使用 DataTables.net – 第1部分 – 基础
https://codeproject.org.cn/Articles/5385033/ASP-NET-8-Using-DataTables-net-Part1-Foundation

[22] ASP.NET8 使用 DataTables.net – 第2部分 – 操作按钮
https://codeproject.org.cn/Articles/5385098/ASP-NET8-using-DataTables-net-Part2-Action-buttons

[23] ASP.NET8 使用 DataTables.net – 第3部分 – 状态保存
https://codeproject.org.cn/Articles/5385308/ASP-NET8-using-DataTables-net-Part3-State-saving

[24] ASP.NET8 使用 DataTables.net – 第4部分 – 多语言
https://codeproject.org.cn/Articles/5385407/ASP-NET8-using-DataTables-net-Part4-Multilingual

[25] ASP.NET8 使用 DataTables.net – 第5部分 – 在 AJAX 中传递附加参数
https://codeproject.org.cn/Articles/5385575/ASP-NET8-using-DataTables-net-Part5-Passing-additi

[26] ASP.NET8 使用 DataTables.net – 第6部分 – 在 AJAX 中返回附加参数
https://codeproject.org.cn/Articles/5385692/ASP-NET8-using-DataTables-net-Part6-Returning-addi

[27] ASP.NET8 使用 DataTables.net – 第7部分 – 常规按钮
https://codeproject.org.cn/Articles/5385828/ASP-NET8-using-DataTables-net-Part7-Buttons-regula

[28] ASP.NET8 使用 DataTables.net – 第8部分 – 选择行
https://codeproject.org.cn/Articles/5386103/ASP-NET8-using-DataTables-net-Part8-Select-rows

[29] ASP.NET8 使用 DataTables.net – 第9部分 – 高级筛选器
https://codeproject.org.cn/Articles/5386263/ASP-NET8-using-DataTables-net-Part9-Advanced-Filte

 

 

© . All rights reserved.