Загрузка ASP.Net MVC JSONResult jQuery DataTables

Я пытаюсь заставить DataTables (http://datatables.net) работать с JsonResult, возвращаемым ASP.Net MVC Controller. Я продолжаю получать предупреждение "DataTables (таблица 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 - это простой класс С# с двумя свойствами, числом и описанием.

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 });

Я все еще получаю ошибку. Любые советы, пожалуйста?

Спасибо!

Ответ 1

Следующее отлично работает для меня:

$(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);
}

Ответ 2

В этом показано, что данные, возвращаемые из метода контроллера, должны быть в определенном формате. Он фактически возвращает список как часть aaData. Он также объясняет, для чего предназначены каждый параметр. Возможно, вы просто не форматируете возврат в формате json, который понимает DataTables.

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);
    }
}