Как условно рисовать столбцы datatables на страницах razor

В настоящее время мы делаем это, чтобы нарисовать столбцы для DataTable на стороне сервера для 2 разных пользователей, мы смогли скрыть заголовки столбцов, используя код бритвы, чтобы рисовать их только тогда, когда пользователь является администратором или администратором группы. Однако когда дело доходит до отрисовки данных, у нас возникают следующие проблемы:

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 ссылки на значки?

1
0
253
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете определить массив по умолчанию в переменной и вставить в него 2 значка ссылки внутри if перед возвратом:

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

        var dataArray = [{ "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" }];

        if (allowedToDelete) {
            return dataArray.Concat([{
                "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>";
                }
            }]).ToArray();
        } else {
            return dataArray;
        }
    }
Ответ принят как подходящий

Вы можете использовать columns.visible option для отображения / скрытия столбца соответственно.

Вдобавок, возможно, стоит взглянуть на Многоразовые рендереры, чтобы избежать некоторых повторений с функциями рендеринга.

Создание такой функции рендеринга может выглядеть так:

$.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')
},

Другие вопросы по теме