Skip to content

Commit c109f4e

Browse files
committed
Added support for output as an array of objects for newer versions of datatables.js. (fixed embedded resources)
1 parent 7761f67 commit c109f4e

File tree

3 files changed

+58
-26
lines changed

3 files changed

+58
-26
lines changed
Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,100 @@
1-
using System.Web;
2-
using System.Web.Script.Serialization;
1+
using Mvc.JQuery.Datatables.Models;
2+
using Mvc.JQuery.Datatables.Reflection;
3+
using Mvc.JQuery.Datatables.Util;
34
using System;
45
using System.Collections.Generic;
56
using System.Linq;
7+
using System.Web;
68
using System.Web.Mvc;
7-
using Mvc.JQuery.Datatables.Models;
8-
using Mvc.JQuery.Datatables.Reflection;
9-
using Mvc.JQuery.Datatables.Util;
9+
using System.Web.Script.Serialization;
1010

1111
namespace Mvc.JQuery.Datatables
1212
{
13-
public abstract class DataTablesResult : ActionResult
13+
public abstract class DataTablesResult : ActionResult
1414
{
1515
/// <typeparam name="TSource"></typeparam>
1616
/// <typeparam name="TTransform"></typeparam>
1717
/// <param name="q">A queryable for the data. The properties of this can be marked up with [DataTablesAttribute] to control sorting/searchability/visibility</param>
1818
/// <param name="dataTableParam"></param>
1919
/// <param name="transform">//a transform for custom column rendering e.g. to do a custom date row => new { CreatedDate = row.CreatedDate.ToString("dd MM yy") } </param>
2020
/// <returns></returns>
21-
public static DataTablesResult<TSource> Create<TSource, TTransform>(IQueryable<TSource> q, DataTablesParam dataTableParam, Func<TSource, TTransform> transform)
21+
public static DataTablesResult<TSource> Create<TSource, TTransform>(IQueryable<TSource> q, DataTablesParam dataTableParam,
22+
Func<TSource, TTransform> transform, ArrayOutputType? arrayOutput = null)
2223
{
2324
var result = new DataTablesResult<TSource>(q, dataTableParam);
25+
2426
result.Data = result.Data
2527
.Transform<TSource, Dictionary<string, object>>(row => TransformTypeInfo.MergeTransformValuesIntoDictionary(transform, row))
26-
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues)
27-
.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray());
28-
28+
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues);
29+
30+
result.Data = ApplyOutputRules(result.Data, arrayOutput);
31+
2932
return result;
3033
}
3134

32-
public static DataTablesResult<TSource> Create<TSource>(IQueryable<TSource> q, DataTablesParam dataTableParam)
35+
public static DataTablesResult<TSource> Create<TSource>(IQueryable<TSource> q, DataTablesParam dataTableParam,
36+
ArrayOutputType? arrayOutput = null)
3337
{
3438
var result = new DataTablesResult<TSource>(q, dataTableParam);
3539

3640
result.Data = result.Data
3741
.Transform<TSource, Dictionary<string, object>>(DataTablesTypeInfo<TSource>.ToDictionary)
38-
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues)
39-
.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray()); ;
42+
.Transform<Dictionary<string, object>, Dictionary<string, object>>(StringTransformers.StringifyValues);
43+
44+
result.Data = ApplyOutputRules(result.Data, arrayOutput);
45+
4046
return result;
4147
}
4248

49+
private static DataTablesData ApplyOutputRules(DataTablesData sourceData, ArrayOutputType? arrayOutput = null)
50+
{
51+
DataTablesData outputData = sourceData;
52+
53+
switch (arrayOutput)
54+
{
55+
case ArrayOutputType.ArrayOfObjects:
56+
// Nothing is needed
57+
break;
58+
case ArrayOutputType.BiDimensionalArray:
59+
default:
60+
outputData = sourceData.Transform<Dictionary<string, object>, object[]>(d => d.Values.ToArray());
61+
break;
62+
}
63+
64+
return outputData;
65+
}
4366

4467
/// <param name="transform">Should be a Func<T, TTransform></param>
45-
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam, object transform)
68+
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam, object transform,
69+
ArrayOutputType? arrayOutput = null)
4670
{
4771
var s = "Create";
4872
var openCreateMethod = typeof(DataTablesResult).GetMethods().Single(x => x.Name == s && x.GetGenericArguments().Count() == 2);
4973
var queryableType = queryable.GetType().GetGenericArguments()[0];
5074
var transformType = transform.GetType().GetGenericArguments()[1];
5175
var closedCreateMethod = openCreateMethod.MakeGenericMethod(queryableType, transformType);
52-
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, transform });
76+
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, transform, arrayOutput });
5377
}
5478

55-
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam)
79+
public static DataTablesResult Create(IQueryable queryable, DataTablesParam dataTableParam,
80+
ArrayOutputType? arrayOutput = null)
5681
{
5782
var s = "Create";
5883
var openCreateMethod = typeof(DataTablesResult).GetMethods().Single(x => x.Name == s && x.GetGenericArguments().Count() == 1);
5984
var queryableType = queryable.GetType().GetGenericArguments()[0];
6085
var closedCreateMethod = openCreateMethod.MakeGenericMethod(queryableType);
61-
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam });
86+
return (DataTablesResult)closedCreateMethod.Invoke(null, new object[] { queryable, dataTableParam, arrayOutput });
6287
}
6388

64-
public static DataTablesResult<T> CreateResultUsingEnumerable<T>(IEnumerable<T> q, DataTablesParam dataTableParam)
89+
public static DataTablesResult<T> CreateResultUsingEnumerable<T>(IEnumerable<T> q, DataTablesParam dataTableParam,
90+
ArrayOutputType? arrayOutput = null)
6591
{
66-
return Create(q.AsQueryable(), dataTableParam);
92+
return Create(q.AsQueryable(), dataTableParam, arrayOutput);
6793
}
68-
6994
}
7095

71-
7296
public class DataTablesResult<TSource> : DataTablesResult
7397
{
74-
7598
public DataTablesData Data { get; set; }
7699

77100
internal DataTablesResult(IQueryable<TSource> q, DataTablesParam dataTableParam)
@@ -87,18 +110,20 @@ public override void ExecuteResult(ControllerContext context)
87110
{
88111
if (context == null)
89112
throw new ArgumentNullException("context");
113+
90114
HttpResponseBase response = context.HttpContext.Response;
91115

92116
var scriptSerializer = new JavaScriptSerializer()
93117
{
94118
MaxJsonLength = int.MaxValue
95119
};
120+
96121
response.Write(scriptSerializer.Serialize(this.Data));
97122
}
98123

99124
DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
100125
{
101-
var totalRecords = data.Count(); //annoying this, as it causes an extra evaluation..
126+
var totalRecords = data.Count(); // annoying this, as it causes an extra evaluation..
102127

103128
var filters = new DataTablesFiltering();
104129

@@ -110,7 +135,6 @@ DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
110135
var skipped = filteredData.Skip(param.iDisplayStart);
111136
var page = (param.iDisplayLength <= 0 ? skipped : skipped.Take(param.iDisplayLength)).ToArray();
112137

113-
114138
var result = new DataTablesData
115139
{
116140
iTotalRecords = totalRecords,
@@ -121,7 +145,5 @@ DataTablesData GetResults(IQueryable<TSource> data, DataTablesParam param)
121145

122146
return result;
123147
}
124-
125-
126148
}
127149
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+

2+
namespace Mvc.JQuery.Datatables.Models
3+
{
4+
public enum ArrayOutputType
5+
{
6+
BiDimensionalArray,
7+
ArrayOfObjects
8+
}
9+
}

Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
<Compile Include="DataTablesFiltering.cs" />
8383
<Compile Include="DataTablesFilterAttribute.cs" />
8484
<Compile Include="LengthMenuVm.cs" />
85+
<Compile Include="Models\ArrayOutputType.cs" />
8586
<Compile Include="Models\ColDef.cs" />
8687
<Compile Include="ColumnFilterSettingsVm.cs" />
8788
<Compile Include="DataTablesAttribute.cs" />

0 commit comments

Comments
 (0)