【问题标题】:Sorting by a Date column in Datatables.net按 Datatables.net 中的日期列排序
【发布时间】:2020-02-07 15:08:28
【问题描述】:

我似乎无法弄清楚我的日期列是否正确排序。我一直将此作为参考https://datatables.net/blog/2014-12-18。我正在使用带有母版页的 asp.net。

我按以下顺序加入:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
<script type="text/javascript" src="<%=ResolveUrl("~/Assets/js/plugins/jquery.dataTables.min.js")%>"></script>
<script type="text/javascript" src="https://cdn.datatables.net/plug-ins/1.10.20/sorting/datetime-moment.js"></script>

在母版页上,我有一个函数,我传入表 ID 和我希望可打印的列,以在内容页面上格式化数据表,这对于创建我的数据表非常有效。

function formatDatatable(id, printableColumns) {
                $(id).DataTable({
                    "pagingType": "full_numbers",
                    "lengthMenu": [
                        [10, 25, 50, -1],
                        [10, 25, 50, "All"]
                    ],
                    responsive: {
                        breakpoints: [
                            { name: 'desktop', width: Infinity },
                            { name: 'tablet', width: 1024 },
                            { name: 'fablet', width: 768 },
                            { name: 'phone', width: 480 }
                        ]
                    },
                    language: {
                        search: "_INPUT_",
                        searchPlaceholder: "Search records",
                    },
                    dom: 'Bfrtip',
                    buttons: [
                        'copy',
                        {
                            extend: 'excel',
                            exportOptions: {
                                columns: printableColumns
                            },
                        },
                        {
                            extend: 'pdf',
                            exportOptions: {
                                columns: printableColumns
                            }
                        },
                        {
                            extend: 'print',
                            exportOptions: {
                                columns: printableColumns
                            }
                        }
                    ]
                });
            }

另外,在母版页上我有以下代码:

            $(document).ready(function () {
                    console.log(moment('Dec 1 2019 12:00AM', 'MMM d YYYY hh:mma').isValid()); //validates to true
                    $.fn.dataTable.moment('MMM d YYYY hh:mma');
                });

}

最后,我认为需要的最后一个函数。我尝试在 $(document).ready 和外部添加它,结果相同。我添加了一些日志,它会在加载数据表时打印 test1 和 test2,但在表格格式化后它不会创建任何日志,我尝试对列进行排序。

$.fn.dataTable.moment = function (format, locale) {
                    console.log("test1");
                    var types = $.fn.dataTable.ext.type;

                    // Add type detection
                    types.detect.unshift(function (d) {
                        console.log("test2");
                        return moment(d, format, locale, true).isValid() ?
                            'moment-' + format :
                            null;
                    });

                    // Add sorting method - use an integer for the sorting
                    types.order['moment-' + format + '-pre'] = function (d) {
                        console.log("test3");
                        return moment(d, format, locale, true).unix();
                    };
                };

以下是我尝试排序的表格中的一些日期:2019 年 12 月 1 日上午 12:00、2020 年 1 月 2 日上午 3:58、2023 年 1 月 1 日晚上 11:59

对此的任何帮助将不胜感激。

【问题讨论】:

  • 我只是在具有正确排序格式的列中添加了一个隐藏的&lt;span class="d-none"&gt;yyyymmdd&lt;/span&gt;。这总是有效的
  • 对不起,我上周没有回答你。我在我的 c# 中尝试了这个实现,它似乎解决了我的问题。本周将不得不做一些进一步的测试,如果一切顺利,我将按照我所做的提交我的答案。感谢您的帮助。

标签: asp.net sorting date datatables


【解决方案1】:

我在上面的 cmets 中接受了 VDWWD 的建议。我更新为使用我的数据返回隐藏的跨度,而不是使用给我带来很多问题的时刻 js。

首先我创建了一个接收可为空的日期时间的函数:

public static string createDateColumnSpan(DateTime? date)
    {
        //if there is a date, format it
        if(date != null)
        {
            return "<span class='d-none'>" + Convert.ToDateTime(date).ToString("yyyyMMddHHmm") + "</span>";
        }
        //else return empty string
        else
        {
            return "";
        }
    }

在我的 linq 查询中,我可以像这样调用函数:

//get a list of events
var eventList = (from e in db.Events orderby e.DueDate select new
                {
                    e.ID,
                    e.DueDate
                }).AsEnumerable().Select(x => new
                {
                    x.ID,
                    DueDate = createDateColumnSpan(x.DueDate) + x.DueDate.ToString(),
                });

在此之后,该列使用 datatables.net 在客户端正确排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多