-
Notifications
You must be signed in to change notification settings - Fork 149
/
Copy pathDataTablesModelBinder.cs
102 lines (95 loc) · 4.26 KB
/
DataTablesModelBinder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Web.Mvc;
using Mvc.JQuery.DataTables;
namespace Mvc.JQuery.DataTables
{
/// <summary>
/// Model binder for datatables.js parameters a la http://geeksprogramando.blogspot.com/2011/02/jquery-datatables-plug-in-with-asp-mvc.html
/// </summary>
public class DataTablesModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueProvider = bindingContext.ValueProvider;
int columns = GetValue<int>(valueProvider, "iColumns");
if (columns == 0)
{
return BindV10Model(valueProvider);
}
else
{
return BindLegacyModel(valueProvider, columns);
}
}
private object BindV10Model(IValueProvider valueProvider)
{
DataTablesParam obj = new DataTablesParam();
obj.iDisplayStart = GetValue<int>(valueProvider, "start");
obj.iDisplayLength = GetValue<int>(valueProvider, "length");
obj.sSearch = GetValue<string>(valueProvider, "search[value]");
obj.bEscapeRegex = GetValue<bool>(valueProvider, "search[regex]");
obj.sEcho = GetValue<int>(valueProvider, "draw");
int colIdx = 0;
while (true)
{
string colPrefix = String.Format("columns[{0}]", colIdx);
string colName = GetValue<string>(valueProvider, colPrefix+"[data]");
if (String.IsNullOrWhiteSpace(colName)) {
break;
}
obj.sColumnNames.Add(colName);
obj.bSortable.Add(GetValue<bool>(valueProvider, colPrefix+"[orderable]"));
obj.bSearchable.Add(GetValue<bool>(valueProvider, colPrefix+"[searchable]"));
obj.sSearchValues.Add(GetValue<string>(valueProvider, colPrefix+"[search][value]"));
obj.bEscapeRegexColumns.Add(GetValue<bool>(valueProvider, colPrefix+"[searchable][regex]"));
colIdx++;
}
obj.iColumns = colIdx;
colIdx = 0;
while (true)
{
string colPrefix = String.Format("order[{0}]", colIdx);
int? orderColumn = GetValue<int?>(valueProvider, colPrefix+"[column]");
if (orderColumn.HasValue)
{
obj.iSortCol.Add(orderColumn.Value);
obj.sSortDir.Add(GetValue<string>(valueProvider, colPrefix+"[dir]"));
colIdx++;
}
else
{
break;
}
}
obj.iSortingCols = colIdx;
return obj;
}
private DataTablesParam BindLegacyModel(IValueProvider valueProvider, int columns)
{
DataTablesParam obj = new DataTablesParam(columns);
obj.iDisplayStart = GetValue<int>(valueProvider, "iDisplayStart");
obj.iDisplayLength = GetValue<int>(valueProvider, "iDisplayLength");
obj.sSearch = GetValue<string>(valueProvider, "sSearch");
obj.bEscapeRegex = GetValue<bool>(valueProvider, "bEscapeRegex");
obj.iSortingCols = GetValue<int>(valueProvider, "iSortingCols");
obj.sEcho = GetValue<int>(valueProvider, "sEcho");
for (int i = 0; i < obj.iColumns; i++)
{
obj.bSortable.Add(GetValue<bool>(valueProvider, "bSortable_" + i));
obj.bSearchable.Add(GetValue<bool>(valueProvider, "bSearchable_" + i));
obj.sSearchValues.Add(GetValue<string>(valueProvider, "sSearch_" + i));
obj.bEscapeRegexColumns.Add(GetValue<bool>(valueProvider, "bEscapeRegex_" + i));
obj.iSortCol.Add(GetValue<int>(valueProvider, "iSortCol_" + i));
obj.sSortDir.Add(GetValue<string>(valueProvider, "sSortDir_" + i));
}
return obj;
}
private static T GetValue<T>(IValueProvider valueProvider, string key)
{
ValueProviderResult valueResult = valueProvider.GetValue(key);
return (valueResult==null)
? default(T)
: (T)valueResult.ConvertTo(typeof(T));
}
}
}