javascript - 如何在 Razor 页面中有条件地绘制 DataTables 列

标签 javascript razor asp.net-core datatables

目前我们这样做是为了为 2 个不同的用户绘制服务器端 DataTable 的列,我们能够使用 Razor 代码隐藏列标题,以便仅在用户是管理员或组管理员时绘制它们。但是,在绘制数据时,我们遇到了以下问题:

function getTableColumns() {
            var allowedToDelete = @(User.IsInRole("SysAdmin") || GroupManager.IsUserGroupAdmin(Model.GroupId, User.FindFirst(ClaimTypes.NameIdentifier).Value) ? "true" : "false");

            if (allowedToDelete) {
                return [{ "defaultContent": "" },
                { "data": "deadlineDate", "name": "DeadlineDate" },
                { "data": "priority", "name": "Priority" },
                { "data": "jobNumber", "name": "JobNumber" },
                { "data": "project", "name": "Project" },
                { "data": "description", "name": "Description" },
                { "data": "reference", "name": "Reference" },
                { "data": "subReference", "name": "SubReference" },
                { "data": "employee", "name": "Employee" },
                { "data": "allocatedTo", "name": "AllocatedTo" },
                {
                    "render": function (data, type, full, meta) {
                        return "<i title ='Archive Item' class='fa fa-archive table-icon-view' onclick='archiveJob(\""
                            + full.groupId + "\",\"" + full.id + "\")'></i>";
                    }
                },
                {
                    "render": function (data, type, full, meta) {
                        return "<i title ='Edit' class='fa fa-pencil table-icon-edit' onclick='editJob(\""
                            + full.groupId + "\",\"" + full.id + "\")'></i>";
                    }
                },
                {
                    "render": function (data, type, full, meta) {
                        return "<i title ='Delete' class='fa fa-trash table-icon-delete' onclick='showDeleteModal(\""
                            + full.groupId + "\",\"" + full.id + "\")'></i>";
                    }
                },
                { "data": "issueDate" },
                { "data": "startDate" },
                { "data": "createdBy" },
                { "data": "createdDate" },
                { "data": "notes" }];
            } else {
                return [{ "defaultContent": "" },
                { "data": "deadlineDate", "name": "DeadlineDate" },
                { "data": "priority", "name": "Priority" },
                { "data": "jobNumber", "name": "JobNumber" },
                { "data": "project", "name": "Project" },
                { "data": "description", "name": "Description" },
                { "data": "reference", "name": "Reference" },
                { "data": "subReference", "name": "SubReference" },
                { "data": "employee", "name": "Employee" },
                { "data": "allocatedTo", "name": "AllocatedTo" },
                {
                    "render": function (data, type, full, meta) {
                        return "<i title ='Edit' class='fa fa-pencil table-icon-edit' onclick='editJob(\""
                            + full.groupId + "\",\"" + full.id + "\")'></i>";
                    }
                },
                { "data": "issueDate" },
                { "data": "startDate" },
                { "data": "createdBy" },
                { "data": "createdDate" },
                { "data": "notes" }];
            }
        }

有没有办法优化这个,这样我们就不必为了隐藏 2 个图标链接而重复代码?

最佳答案

您可以使用 columns.visible option相应地显示/隐藏列。

此外,可能值得一看 Reusable renderers避免一些与渲染功能的重复。

创建这样的渲染函数可能如下所示:

$.fn.dataTable.render.icon = function ( title, icon, func) {
    return function ( data, type, row ) {
        return "<i title ='" + title + "' class='fa " + icon + "' onclick='" + func + "(\""
            + row.groupId + "\",\"" + row.id + "\")'></i>";
    }
};

然后您可以按如下方式使用它:

{
    //Column visibility
    visible: allowedToDelete,
    //Reusable renderer
    render: $.fn.dataTable.render.icon('Archive Item', 'fa-archive table-icon-view', 'archiveJob')
},
{
    visible: allowedToDelete,
    render: $.fn.dataTable.render.icon('Edit', 'fa-pencil table-icon-edit', 'editJob')
},
{
    visible: allowedToDelete,
    render: $.fn.dataTable.render.icon('Delete', 'fa-trash table-icon-delete', 'showDeleteModal')
},

关于javascript - 如何在 Razor 页面中有条件地绘制 DataTables 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49773004/

相关文章:

javascript - 在子点击时从父级中删除类 - jQuery

javascript - this.parse(属性);在 Backbone 模型源代码中

javascript - 移除之前设置的边框颜色

c# - "@Scripts.Render"和 "&lt;script&gt;"有什么区别?

c# - asp.net core DI - 我可以使服务依赖于其他服务吗

c# - Status Entities in .NET Core Entity Framework - 建议的实现

javascript - 获取错误消息;资源加载失败: the server responded with a status of 500

javascript - 使用 Javascript 或 JQuery 的 Html.TextBoxFor 的明文

asp.net-mvc - foreach 中 switch 语句的正确 Razor 语法

c# - 将请求传递给另一个 API