加载 ASP.Net MVC JSONResult jQuery DataTables

11
我试图让DataTables (http://datatables.net) 能够与由ASP.Net MVC Controller返回的JsonResult一起使用。 我不断收到“DataTables warning(table id ='example'):从数据源请求未知参数'0',行0”的错误消息,根据文档,这意味着它找不到列。控制器中返回JsonResult的代码如下:
    public JsonResult LoadPhoneNumbers()
    {
        List<PhoneNumber> phoneNumbers = new List<PhoneNumber>();
        PhoneNumber num1 = new PhoneNumber { Number = "555 123 4567", Description = "George" };
        PhoneNumber num2 = new PhoneNumber { Number = "555 765 4321", Description = "Kevin" };
        PhoneNumber num3 = new PhoneNumber { Number = "555 555 4781", Description = "Sam" };

        phoneNumbers.Add(num1);
        phoneNumbers.Add(num2);
        phoneNumbers.Add(num3);

        return Json(phoneNumbers, JsonRequestBehavior.AllowGet);
    }

PhoneNumber是一个普通的C#类,具有2个属性:Number(号码)和Description(描述)。

检索并加载数据的JavaScript代码如下:

<script>
$(document).ready(function () {
    $('#example').dataTable({
        "bProcessing": true,
        "sAjaxSource": '/Account/LoadPhoneNumbers/',
        "sAjaxDataProp": ""
    });
});
</script>

而 HTML 看起来像这样:

<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
<thead>
    <tr>
        <th>
            Number
        </th>
        <th>
            Description
        </th>
    </tr>
</thead>
<tbody>
</tbody>
<tfoot>
</tfoot>
</table>

我故意将sAjaxDataProp设置为空字符串,以便 DataTables 不会查找 aaData。即使我在控制器中明确设置了 aaData,也是如此:

return Json(new { aaData = phoneNumbers });

我仍然收到这个错误。 有什么建议吗?

谢谢!

2个回答

18

以下方法对我来说非常有效:

$(function () {
    $('#example').dataTable({
        bProcessing: true,
        sAjaxSource: '@Url.Action("LoadPhoneNumbers", "Home")'
    });
});

我已移除sAjaxDataProp属性。

使用此数据源:

public ActionResult LoadPhoneNumbers()
{
    return Json(new
    {
        aaData = new[] 
        {
            new [] { "Trident", "Internet Explorer 4.0", "Win 95+", "4", "X" },
            new [] { "Gecko", "Firefox 1.5", "Win 98+ / OSX.2+", "1.8", "A" },
            new [] { "Webkit", "iPod Touch / iPhone", "iPod", "420.1", "A" }
        }
    }, JsonRequestBehavior.AllowGet);
}

以您的手机为例,可以这样做:

public ActionResult LoadPhoneNumbers()
{
    var phoneNumbers = new List<PhoneNumber>(new[] 
    {
        new PhoneNumber { Number = "555 123 4567", Description = "George" },
        new PhoneNumber { Number = "555 765 4321", Description = "Kevin" },
        new PhoneNumber { Number = "555 555 4781", Description = "Sam" }
    });

    return Json(new
    {
        aaData = phoneNumbers.Select(x => new[] { x.Number, x.Description })
    }, JsonRequestBehavior.AllowGet);
}

好的,问题出在PhoneNumbers类被序列化的方式上...如果你在Fiddler中查看JSON,它看起来像这样: [{"Number":"555 123 4567","Description":"George"},{"Number":"555 765 4321","Description":"Kevin"},{"Number":"555 555 4781","Description":"Sam"}]如何去掉属性名称Number和Description呢? - PW763
@PW763,是的,问题出在您格式化JSON的方式上。请查看我的更新答案,其中包含正确格式化电话号码的示例。 - Darin Dimitrov
嗨,Dari,我遇到了类似的问题。我相信你会知道答案,我已经提出了一个新的问题,这是链接http://stackoverflow.com/questions/14352736/controller-method-is-not-hitting-in-datatables-c-sharp-mvc - Naruto
脚本失败,因为缺少'aDataSort'参数。 - Vasil Valchev
你需要在你的DataTable脚本代码中添加"columns":[你的列值]参数。 - Vasil Valchev

0
在这个示例中,似乎控制器方法返回的数据需要以特定格式呈现。实际上,他将列表作为aaData的一部分返回。它还解释了每个参数的用途。也许你只是没有以DataTables理解的json格式进行返回。
public class HomeController : Controller
{
    public ActionResult AjaxHandler(jQueryDataTableParamModel param)
    {
        return Json(new{
                sEcho = param.sEcho,
                iTotalRecords = 97,
                iTotalDisplayRecords = 3,
                aaData = new List<string[]>() {
                    new string[] {"1", "a1", "a2", "a3"},
                    new string[] {"2", "b1", "b2", "b3"},
                    new string[] {"3", "c1", "c2", "c3"}
                    }
            },
        JsonRequestBehavior.AllowGet);
    }
}

另外,你的HTML标签是否已经闭合,还是只是复制/粘贴时出现了错误。 - HashTagDevDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接