如何使用带有服务器端数据的子行初始化数据表?

问题描述 投票:0回答:1

我正在构建一个MVC应用程序,在其中我将数据从控制器传递到我的视图中。

我还使用jQuery JavaScript库数据表来显示我的信息。我遇到的问题是我想使用child row手风琴功能在隐藏状态下显示其他信息属性(列)。

问题是显示了每个示例,都使用ajax设置了它来提取数据。

作为参考,我已经提取了使用的JavaScript代码。显然,我不能在JS脚本标记内使用Razor(服务器端)语法,但是我需要知道如何执行与定义的“格式”功能相同的操作:

/* Formatting function for row details - modify as you need */
function format ( d ) {
    // `d` is the original data object for the row
    return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
        '<tr>'+
            '<td>Full name:</td>'+
            '<td>'+d.name+'</td>'+
        '</tr>'+
        '<tr>'+
            '<td>Extension number:</td>'+
            '<td>'+d.extn+'</td>'+
        '</tr>'+
        '<tr>'+
            '<td>Extra info:</td>'+
            '<td>And any further details here (images etc)...</td>'+
        '</tr>'+
    '</table>';
}

$(document).ready(function() {
    var table = $('#example').DataTable( {
        "ajax": "../ajax/data/objects.txt",
        "columns": [
            {
                "className":      'details-control',
                "orderable":      false,
                "data":           null,
                "defaultContent": ''
            },
            { "data": "name" },
            { "data": "position" },
            { "data": "office" },
            { "data": "salary" }
        ],
        "order": [[1, 'asc']]
    } );

    // Add event listener for opening and closing details
    $('#example tbody').on('click', 'td.details-control', function () {
        var tr = $(this).closest('tr');
        var row = table.row( tr );

        if ( row.child.isShown() ) {
            // This row is already open - close it
            row.child.hide();
            tr.removeClass('shown');
        }
        else {
            // Open this row
            row.child( format(row.data()) ).show();
            tr.addClass('shown');
        }
    } );
} );
jquery asp.net-mvc datatables
1个回答
0
投票

您可以在Javascript中100%使用Razor,但是您将无法执行的操作是引用您可能用于呈现主要行的foreach循环。

您仍然需要JS来隐藏/显示子行,但是类似这样:

@foreach (var item in Model)
{
    <tr role="row">
        <td class="details-control"></td>
        <td class="sorting_1">@item.Name</td>
        <td>@item.Position</td>
        <td>@item.Office</td>
        <td>@item.Salary</td>
    </td>
    <tr class="hidden">
        <td colspan="5">
            <table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">
                <tr>
                    <td>@Html.DisplayNameFor(modelItem => item.Name):</td>
                    <td>@item.Name</td>
                    <td>@Html.DisplayNameFor(modelItem => item.Extension):</td>
                    <td>@item.Extension</td>
                    <td>@Html.DisplayNameFor(modelItem => item.Info):</td>
                    <td>@item.Info</td>
                </tr>
            </table>
        </td>
    </tr>
}

[hidden类将display: none;设置为另一个shown类或其他将其设置为table-row的位置。

单击td.details-control按钮时,使用JS切换子行的显示。

© www.soinside.com 2019 - 2024. All rights reserved.