.net 仅当用户处于特定角色时才显示DataTable编辑/删除列

mzaanser  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(130)

我对MVC和JS还比较陌生,所以我可能尝试了错误的方法。
我在MVC项目中使用DataTables来显示数据库中的产品列表。在最后一列,我有一个编辑和删除按钮,这应该是只有在管理员角色的用户可见。如果他们不在管理员角色中,那么它仍然应该加载表并隐藏该列。

ProductDTController:

public class ProductDTController : Controller
    {
        private readonly ApplicationDbContext _db;

        public ProductDTController(ApplicationDbContext db)
        {
            _db = db;
        }
        public IActionResult Index()
        {
            List<Product> productList = new List<Product>();
            return View(productList);
        }

        #region API CALLS
        [HttpGet]
        public IActionResult GetAll()
        {
            List<Product> productList = _db.Products.ToList();
            return Json(new { data = productList });
        }
        #endregion
    }

索引.cshtml

@model List<Product>

<div class="card shadow border-0 my-4">
    <div class="card-header bg-secondary bg-gradient m-lg-0 pt-3">
        <div class="row">
            <div class="col-12 text-center">
                <h2 class="text-white py-2">Product List</h2>
            </div>
        </div>
    </div>
    <div class="card-body p-4">
        <div class="row pb-3">
            <div class="col-6">
            </div>
            <div class="col-6 text-end">
                <a asp-controller="Product" asp-action="Upsert" class="btn btn-primary">
                    <i class="bi bi-plus-circle"></i>
                    Create New Product
                </a>
            </div>
        </div>

        <table id="tblData" class="table table-bordered table-striped" width="100%">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Name</th>
                    <th>Brand</th>
                    <th>Description</th>
                    <th>Action</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

@section Scripts {
    <script src="~/js/product.js"></script>
}

product.js

var dataTable;

$(document).ready(function () {
    loadDataTable();
});

function loadDataTable() {
    dataTable = $('#tblData').DataTable({
        ajax: { url: '/ProductDT/GetAll' },
        columns: [
            { data: 'productId', "width": "25%" },
            { data: 'productName', "width": "25%" },
            { data: 'productBrand', "width": "15%" },
            { data: 'productDescription', "width": "10%" },
            {
                data: 'id',
                "render": function (data) {
                    return `<div class="w-75 btn-group" role="group">
                    <a href="ProductDT/Edit?id=${data}" class="btn btn-primary mx-2"><i class="bi bi-pencil-square"></i> Edit</a>
                    <a onClick=Delete('ProductDT/Delete?id=${data}') class="btn btn-danger mx-2"><i class="bi bi-trash-fill"></i> Delete</a>
                    </div>`
                },
                "width": "25%"
            }
        ]
    });
}

在Index.cshtml中-我尝试过:

@if (User.IsInRole("Admin"))
                    {
                        <th>Action</th>
                    } else
                    {
                        <th hidden>Action</th>
                    }

这只会阻止列标题出现,但仍会将“编辑和删除”按钮放在列中。
我试着在product.js中做一些Razor测试,但它没有被识别出来。
用户角色将来自数据库中的AspNetUsers表。

tv6aics1

tv6aics11#

在您的JavaScript中有一个布尔变量,说明此用户是否是管理员

const isAdmin = $('#isAdmin').val();

然后,在DataTable列定义中,为要隐藏的列设置visible属性

{
    data: 'id',
    render: function (data) {
        return `<div class="w-75 btn-group" role="group">
        <a href="ProductDT/Edit?id=${data}" class="btn btn-primary mx-2"><i class="bi bi-pencil-square"></i> Edit</a>
        <a onClick=Delete('ProductDT/Delete?id=${data}') class="btn btn-danger mx-2"><i class="bi bi-trash-fill"></i> Delete</a>
        </div>`
    },
    width: "25%",
    visible: isAdmin
}

请注意,任何用户都可以查看页面的JavaScript并修改此值,因此您 * 必须 * 在服务器上检查用户是否具有正确的权限。

相关问题