I found the problem. I downloaded the source JS and stepped through the read code and found that my data was getting lost in following function:
function
wrapDataAccess(originalFunction, timezone) {
return
function
(data) {
data = originalFunction(data);
convertData(data,
'apply'
, timezone);
return
data || [];
};
}
on the first line where it calls originalFunction(data), it sends my 108 items in and returns undefined. I stepped into that a few layers deep and found an anonymous function returning d.Data where d was my data (a DataSourceResult) but my object had a .data property not a .Data property.
It turns out this is because of a custom json formatter configured in my global.asax. We are using the Newtonsoft CamelCasePropertyNamesContractResolver:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
new
CamelCasePropertyNamesContractResolver();
//Persist camel cased properties in JSON serialization
This is causing the casing of the first character of the property names to change. To solve it, I updated my web api method to explicitly serialize the DataSourceResult using the default resolver like so:
return
Json(scheduleVM.ToDataSourceResult(request),
new
JsonSerializerSettings { ContractResolver =
new
DefaultContractResolver() });