Skip to content

Commit 59e84e3

Browse files
committed
Merge pull request mcintyre321#138 from bak-t/master
ColDefs serialization fix & refactoring.
2 parents 831d039 + ea050a8 commit 59e84e3

File tree

3 files changed

+76
-37
lines changed

3 files changed

+76
-37
lines changed

Mvc.JQuery.Datatables.Core/DataTableConfigVm.cs

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Net.Mime;
45
using System.Web.Routing;
@@ -255,44 +256,45 @@ private static string ConvertDictionaryToJsonBody(IDictionary<string, object> di
255256

256257
private static string ConvertColumnDefsToJson(ColDef[] columns)
257258
{
258-
var nonSortableColumns = columns.Select((x, idx) => x.Sortable ? -1 : idx).Where( x => x > -1).ToArray();
259-
var nonVisibleColumns = columns.Select((x, idx) => x.Visible ? -1 : idx).Where(x => x > -1).ToArray();
260-
var nonSearchableColumns = columns.Select((x, idx) => x.Searchable ? -1 : idx).Where(x => x > -1).ToArray();
261-
var mRenderColumns = columns.Select((x, idx) => string.IsNullOrEmpty(x.MRenderFunction) ? new { x.MRenderFunction, Index = -1 } : new { x.MRenderFunction, Index = idx }).Where(x => x.Index > -1).ToArray();
262-
var CssClassColumns = columns.Select((x, idx) => string.IsNullOrEmpty(x.CssClass) ? new { x.CssClass, Index = -1 } : new { x.CssClass, Index = idx }).Where(x => x.Index > -1).ToArray();
263-
264-
259+
Func<bool, bool> isFalse = x => x == false;
260+
Func<string, bool> isNonEmptyString = x => !string.IsNullOrEmpty(x);
265261

266262
var defs = new List<dynamic>();
267263

268-
if (nonSortableColumns.Any())
269-
defs.Add(new { bSortable = false, aTargets = nonSortableColumns });
270-
if (nonVisibleColumns.Any())
271-
defs.Add(new { bVisible = false, aTargets = nonVisibleColumns });
272-
if (nonSearchableColumns.Any())
273-
defs.Add(new { bSearchable = false, aTargets = nonSearchableColumns });
274-
if (mRenderColumns.Any())
275-
foreach (var mRenderColumn in mRenderColumns)
276-
{
277-
defs.Add(new { mRender = "%" + mRenderColumn.MRenderFunction + "%", aTargets = new[] {mRenderColumn.Index} });
278-
}
279-
if (CssClassColumns.Any())
280-
foreach (var CssClassColumn in CssClassColumns)
281-
{
282-
defs.Add(new { className = CssClassColumn.CssClass, aTargets = new[] { CssClassColumn.Index } });
283-
}
284-
285-
for(var i=0;i<columns.Length;i++)
286-
{
287-
if (columns[i].Width != null)
288-
{
289-
defs.Add(new { width = columns[i].Width, aTargets = new[] { i} });
290-
}
291-
}
292-
264+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
265+
jsonPropertyName: "bSortable",
266+
propertySelector: column => column.Sortable,
267+
propertyPredicate: isFalse,
268+
columns: columns));
269+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
270+
jsonPropertyName: "bVisible",
271+
propertySelector: column => column.Visible,
272+
propertyPredicate: isFalse,
273+
columns: columns));
274+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
275+
jsonPropertyName: "bSearchable",
276+
propertySelector: column => column.Searchable,
277+
propertyPredicate: isFalse,
278+
columns: columns));
279+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
280+
jsonPropertyName: "mRender",
281+
propertySelector: column => column.MRenderFunction,
282+
propertyConverter: x => new JRaw(x),
283+
propertyPredicate: isNonEmptyString,
284+
columns: columns));
285+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
286+
jsonPropertyName: "className",
287+
propertySelector: column => column.CssClass,
288+
propertyPredicate: isNonEmptyString,
289+
columns: columns));
290+
defs.AddRange(ConvertColumnDefsToTargetedProperty(
291+
jsonPropertyName: "width",
292+
propertySelector: column => column.Width,
293+
propertyPredicate: isNonEmptyString,
294+
columns: columns));
293295

294296
if (defs.Count > 0)
295-
return new JavaScriptSerializer().Serialize(defs).Replace("\"%", "").Replace("%\"", "");
297+
return JsonConvert.SerializeObject(defs);
296298

297299
return "[]";
298300
}
@@ -312,5 +314,42 @@ private static IDictionary<string, object> ConvertObjectToDictionary(object obj)
312314
// Doing this way because RouteValueDictionary converts to Json in wrong format
313315
return new Dictionary<string, object>(new RouteValueDictionary(obj));
314316
}
317+
318+
private static IEnumerable<JObject> ConvertColumnDefsToTargetedProperty<TProperty>(
319+
string jsonPropertyName,
320+
Func<ColDef, TProperty> propertySelector,
321+
Func<TProperty, bool> propertyPredicate,
322+
IEnumerable<ColDef> columns)
323+
{
324+
return ConvertColumnDefsToTargetedProperty(
325+
jsonPropertyName,
326+
propertySelector,
327+
propertyPredicate,
328+
x => x,
329+
columns);
330+
}
331+
332+
private static IEnumerable<JObject> ConvertColumnDefsToTargetedProperty<TProperty, TResult>(
333+
string jsonPropertyName,
334+
Func<ColDef, TProperty> propertySelector,
335+
Func<TProperty, bool> propertyPredicate,
336+
Func<TProperty, TResult> propertyConverter,
337+
IEnumerable<ColDef> columns)
338+
{
339+
return columns
340+
.Select((x, idx) => new { rawPropertyValue = propertySelector(x), idx })
341+
.Where(x => propertyPredicate(x.rawPropertyValue))
342+
.GroupBy(
343+
x => x.rawPropertyValue,
344+
(rawPropertyValue, groupedItems) => new
345+
{
346+
rawPropertyValue,
347+
indices = groupedItems.Select(x => x.idx)
348+
})
349+
.Select(x => new JObject(
350+
new JProperty(jsonPropertyName, propertyConverter(x.rawPropertyValue)),
351+
new JProperty("aTargets", new JArray(x.indices))
352+
));
353+
}
315354
}
316355
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252
</PropertyGroup>
5353
<ItemGroup>
5454
<Reference Include="EmbeddedResourceVirtualPathProvider, Version=1.3.2.0, Culture=neutral, processorArchitecture=MSIL">
55-
<SpecificVersion>False</SpecificVersion>
56-
<HintPath>..\..\EmbeddedResourceVirtualPathProvider\EmbeddedResourceVirtualPathProvider\bin\Debug\EmbeddedResourceVirtualPathProvider.dll</HintPath>
55+
<HintPath>..\packages\EmbeddedResourceVirtualPathProvider.1.3.2\lib\net40\EmbeddedResourceVirtualPathProvider.dll</HintPath>
56+
<Private>True</Private>
5757
</Reference>
5858
<Reference Include="EntityFramework">
5959
<HintPath>..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.dll</HintPath>

Mvc.JQuery.Datatables.Example/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
<package id="EmbeddedResourceVirtualPathProvider" version="1.3.2" targetFramework="net45" />
55
<package id="EntityFramework" version="6.1.1" targetFramework="net45" />
66
<package id="jQuery" version="2.1.4" targetFramework="net45" />
7-
<package id="jquery-globalize" version="0.1.1" targetFramework="net4" />
87
<package id="jQuery.UI.Combined" version="1.11.4" targetFramework="net45" />
98
<package id="jQuery.UI.i18n" version="1.10.2" targetFramework="net4" />
109
<package id="jQuery.Validation" version="1.8.0.1" targetFramework="net45" />
1110
<package id="jQuery.vsdoc" version="1.6" targetFramework="net4" />
11+
<package id="jquery-globalize" version="0.1.1" targetFramework="net4" />
1212
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
1313
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
1414
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />

0 commit comments

Comments
 (0)