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 ;
34using System ;
45using System . Collections . Generic ;
56using System . Linq ;
7+ using System . Web ;
68using 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
1111namespace 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}
0 commit comments