通过ajax返回列表来填充表 - 值未定义

时间:2014-03-16 17:19:54

标签: jquery ajax json signalr asp.net-mvc-5

我正在学习SignalR im database-change-notifications-asp-net-signalr 当我返回列表时,我的所有列值都未定义

下面是我目前构建的视图

<script type="text/javascript">

$(function () {

    // Proxy created on the fly
    var job = $.connection.myHub;

    // Declare a function on the job hub so the server can invoke it
    job.client.displayStatus = function () {
        getData();
    };

    // Start the connection
      $.connection.hub.start().done(function () {
      getData();
    });
});

function getData() {
    var $tbl = $('#tblJobInfo');
    $.ajax({
        url: '@Url.Action("Get", "Home")',
        type: 'GET',
        datatype: 'json',
        success: function (data) {
            console.log(data);
            if (data.length > 0) {
                $tbl.empty();
                $tbl.append(' <tr><th>ID</th><th>Name</th><th>lname</th><th>phone</th></tr>');
                var rows = [];

                for (var i = 0; i < data.length; i++) {
                    rows.push(' <tr><td>' + data[i].id + '</td><td>' + data[i].fname + '</td><td>' + data[i].lname + '</td><td>' + data[i].phone + '</td></tr>');
                }
                $tbl.append(rows.join(''));
            }
        }
    });
}
</script>

<div>
    <table id="tblJobInfo" style="text-align:center;margin-left:10px"></table>
</div>

当我的页面加载时,调用此方法

public List<JobInfo> Get()
{
    var det = objRepo.GetData();

    return det;
}

我在return det上放了一个断点;我可以在列表中看到相关的值,如前所述,在构建表时,列值是“未定义”

这是JobInfo类

public class JobInfo
{
    public int id { get; set; }
    public string fname { get; set; }
    public string lname { get; set; }
    public string phone { get; set; }
}

任何帮助/指示都将不胜感激。

非常感谢

更新

以下是在执行console.log(数据)时在浏览器中编写的内容;

System.Collections.Generic.List`1[KnockOutjsTutorial.Models.JobInfo]

1 个答案:

答案 0 :(得分:1)

你需要这样做:

$.connection.hub.start().done(function () {
    getData();
});

http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client

由于start()是异步的,因此在getData()完成之前,当前代码中对start()的调用正在执行。通过将代码放在done中,您可以确信SignalR已在此时创建了连接。

编辑:

我认为问题是控制器方法。它看起来像这样吗?

public ActionResult Get()
{
    var data = Get(); // Which returns List<JonInfo>.

    return Json(data);
}

您需要将该作业列表作为JSON返回。

编辑:

根据我们在聊天室中的对话,问题是由致电:

引起的

Clients.All.displayStatus()

并打开多个标签页。所以将代码更改为

Clients.Caller.displayStatus()

应该这样做。