2

更新- 我根据新信息更改了问题:

我们有一个在网格中返回搜索结果的小应用程序。只有一个控制器动作,因为这就是应用程序所做的一切。但是,我们希望根据用户权限隐藏一些数据。例如,根据用户权限,我在 HTML 中隐藏 StockSource 列,如下所示:

<th>Name</th>
@if (Model.UserCanSeeThis)
{ 
    <th>StockSource</th>
}
<th>SomeOtherColumn</th>

然后在这个 js 代码中我们使用DataTables来构建一个显示网格:

  $('#grdSearch').dataTable( {
        "bProcessing": true,
        "sAjaxSource": uri,
        "fnServerData": function(sSource, aoData, fnCallback, oSettings) {
            oSettings.jqXHR = $.ajax(
                {
                    type: "POST",
                    url: sSource,
                    data: JSON.stringify(BuildSearchParams()),
                    contentType: "application/json",
                    dataType: 'json',
                    success: function (data) {
                        if (typeof data["error"] == "undefined") {
                            fnCallback(data);
                        } else {
                            alert(data["error"]);
                        }
                    }
                });
        },
        "aoColumns": [
            { "mData": "Name" },
            { "mData": "StockSource" },
            { "mData": "SomeOtherColumn" }
        ]});

问题是我不能将“StockSource”设置为不可见,因为如果用户没有权限,就没有 StockSource 列可以设置为空。任何想法如何控制这个?

4

3 回答 3

3

我能想到的一种方法是,您可以创建一个内联脚本来处理视图页面上的 aoColumns。

<script>
//Preload with the first column since you know it will always be there
var includedColumns = [{ "mData": "Name" }];
@if (Model.UserCanSeeThis)
{ 
    //Add stock source when the user can see
    includedColumns.push({ "mData": "StockSource" });
}
//Add additional columns
includedColumns.push({ "mData": "SomeOtherColumn" });
</script>


然后你可以只使用变量

$('#grdSearch').dataTable( {
        "bProcessing": true,
        "sAjaxSource": uri,
        "fnServerData": function(sSource, aoData, fnCallback, oSettings) {
            oSettings.jqXHR = $.ajax(
                {
                    type: "POST",
                    url: sSource,
                    data: JSON.stringify(BuildSearchParams()),
                    contentType: "application/json",
                    dataType: 'json',
                    success: function (data) {
                        if (typeof data["error"] == "undefined") {
                            fnCallback(data);
                        } else {
                            alert(data["error"]);
                        }
                    }
                });
        },
        "aoColumns": includedColumns });
于 2013-05-15T19:45:45.310 回答
1

我仍然会在服务器端这样做。只是不要设置变量 StockSource

和 js 看起来像

if (data != null) {
    /* Get data for the given row */
    out = "<table cellpadding='5' cellspacing='0' border='0' style='padding-left:50px;'>";
    out += "<tr><td>Name:</td><td>" + data["Name"] + "</td></tr>";
    if (data["StockSource"])
            out += "<tr><td>Stock Source:</td><td>" + data["StockSource"] + "</td></tr>";
    out += "</table>";
}
于 2013-05-14T23:17:18.947 回答
1

当您使用 MVC 时,我建议您将模型传递回创建表的视图。这样,您可以以比目前更简洁的方式创建所需的列,因为您当前的表生成代码不易维护。

在您看来,您可以简单地检查是否需要该列并呈现它,如果不需要,则不要呈现它。

于 2013-05-14T23:38:25.240 回答