【问题标题】:Hidden details option of dataTables when loaded through model MVC通过模型 MVC 加载时 dataTables 的隐藏详细信息选项
【发布时间】:2015-11-18 15:41:45
【问题描述】:

我有一张员工表,我使用$.load ajax 调用通过发回partialview 如下所示:

模型类

public class EmployeeDetails
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public string AccountStatus{get; set;}
    public string LastLogin{get;set;}
    public string EmailAddress{get;set;}
    public string Contact {get;set;}
    public string Gender {get;set;}
}

控制器中的PartialViewResult方法

public PartialViewResult GetEmployeeDetails()
{
    List<EmployeeDetails> model=new List<EmployeeDetails>();
    using(var context=new ContextConnection())
    {
        var employees=(from e in context.tbl_employees select e).ToList();
        foreach(var employee in employees) //Fill the model
        {
            model.add(new EmployeeDetails(){
                 FirstName=employee.fname,
                 LastName=employee.lname,
                 AccountStatus=employee.acc_status,
                 LastLogin=employee.last_login,
                 EmailAddress=employee.email,
                 Contact=employee.contact,
                 Gender=employee.gender
            });
        }
    }
    return PartialView("_EmployeeDetails",model) //passing model back
}

_员工详情视图

@model IEnumerable<ProjectName.Models.EmployeeDetails>

<table id="employee" class="display" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th></th>
                <th>Full Name</th>
                <th>Account Status</th>
                <th>Last Login</th>
                <th>Email Address</th>
            </tr>
        </thead>
        <tbody>
        @foreach(var emp in Model)
        {
            <tr>
                <td></td>
                <td>@emp.FirstName + " " + @emp.LastName</td>
                <td>@emp.AccountStatus</td>
                <td>@emp.LastLogin</td>
                <td>@emp.EmailAddress</td>
            </tr>
         }
         </tbody>
</table>

来自 this link 我能够实现链接中给出的UI

var table; //global variable
$('.loadEmployee').on('click',function(){
   $("#loadBody").load("/Admin/GetEmployeeDetails",function(){
         table=$("#employee").dataTable({
               "columns": [
                {
                    "className":      'details-control',
                    "orderable":      false,
                    "data":           null,
                    "defaultContent": ''
                },
                { "data": "Full Name" },
                { "data": "Account Status" },
                { "data": "Last Login" },
                { "data": "Email Address" }
                ],
                "order": [[1, 'asc']]
         });
   }
})

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["Full Name"]+'</td>'+ //this is fine
        '</tr>'+
        '<tr>'+
            '<td>Extension number:</td>'+
            '<td>'+d["Contact Details"]+'</td>'+ //Need to get Contact here
        '</tr>'+
        '<tr>'+
            '<td>Gender:</td>'+
            '<td>d["Gender"]</td>'+ //Need to get Gender here
        '</tr>'+
    '</table>';
}

// Add event listener for opening and closing details
$('#employee 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');
    }
 });

我的问题是:

我的模型填充了所有数据,但是如何在format 函数中显示模型中的额外数据(联系人)、(性别)

上面链接中给出的演示使用.txt 文件来提取数据,但没有提到如何根据我的上述场景使用model 数据执行此操作。 + 链接和 - 链接工作正常,但 ContactGender 的模型值未显示。我正在考虑的一种情况是将所有这些作为tds 添加到foreach 中并隐藏它们,以便我可以获取列值,因为我现在正在获取显示的数据。但是当有大量的列要显示时,这会很重。非常感谢您对此的任何想法/提示。

【问题讨论】:

  • 您可以将值添加为data-* 属性,可能添加到&lt;tr&gt; 元素 - &lt;tr data-contact="emp.contact" data-gender="emp.Gender"&gt;,然后使用$('#employee tbody').on('click', 'td.details-control', function () { 等在$('#employee tbody').on('click', 'td.details-control', function () { 函数中获取它们并将这些值传递给你的format() 函数
  • 哦,是的!快点!!我错过了这部分是多么愚蠢.. :) 请将此作为答案发布@StephenMuecke,我会接受它.. :) 但这里还有一个疑问.. 如果您看到该链接,他们会从一些 txt 文件中获取数据,并且他们绑定但仍然没有显示的data 能够从row.data() 获取?这是如何运作的?任何想法.. :)
  • 不要使用 dataTable 插件所以不确定,但我会稍后看看,看看我能找到什么
  • 好的,我想我知道发生了什么。您链接到的示例使用datasource 填充表,在本例中../ajax/data/objects.txt 是json 数据(您可以通过单击示例的Ajax 选项卡查看它)所以"ajax": ... 选项读取数据并存储它(我假设每行中的属性为data-*)。因为 json 包含 extn 的属性,所以即使它没有显示在列中,它的值也会被存储。我假设 row.data() 函数然后读取这些值以便它们可用。
  • 与我的回答大致相同(唯一的区别是因为data-* 属性是以编程方式添加的,因此在查看页面源代码时看不到它们)。我怀疑如果您要使用 "ajax": '@Url.Action(someMethod) 来初始化您的集合并拥有 return Json(model, JsonRequestBehavior.AllowGet); 您将访问 d 对象中的其他属性

标签: c# jquery asp.net-mvc datatables asp.net-mvc-partialview


【解决方案1】:

一种选择是将“额外”值添加为表格行中的data-* 属性。

@foreach(var emp in Model)
{
  <tr data-contact="emp.contact" data-gender="emp.Gender">
    ....
  </tr>
}

然后在按钮单击事件中提取它们并将这些值传递给format() 函数

$('#employee tbody').on('click', 'td.details-control', function () {
  var tr = $(this).closest('tr');
  var contact = tr.data('contact');
  var gender = tr.data('gender');
  // you could also add the following as an option to using the row data
  var fullName = tr.children('td').eq(1).text();
  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(), contact, gender)).show();
    // or row.child(format(fullName, contact, gender)).show();
    tr.addClass('shown');
  }
});

然后更改format()函数以接受附加参数

function format(d, contact, gender) {

【讨论】:

  • 好朋友!!非常感谢.. :)
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多