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

时间:2018-04-11 10:43:20

标签: 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个图标链接?

2 个答案:

答案 0 :(得分:1)

您可以使用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')
},

答案 1 :(得分:0)

您可以在变量中定义默认数组,并在if之前将2个图标链接推入其中,然后返回:

.connect()