Skip to content

Commit f8dcd49

Browse files
Pratik VasaniPratik Vasani
authored andcommitted
Added model binder for WebApi
1 parent 109e26f commit f8dcd49

File tree

5 files changed

+138
-36
lines changed

5 files changed

+138
-36
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>net451</TargetFrameworks>
5+
<RootNamespace>Mvc.JQuery.DataTables</RootNamespace>
6+
<AssemblyName>Mvc.JQuery.DataTables</AssemblyName>
7+
<PackageId>Mvc.JQuery.DataTables</PackageId>
8+
9+
<PackageVersion>1.0.0</PackageVersion>
10+
<Authors>Harry McIntyre</Authors>
11+
<Description>Popular lib for using DataTables.net with IQueryable. Install this package to use with MVC5</Description>
12+
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
13+
<PackageProjectUrl>https://github.com/mcintyre321/mvc.jquery.datatables</PackageProjectUrl>
14+
<Copyright>Harry McIntyre</Copyright>
15+
<PackageTags>jquery datatables iqueryable razor asp mvc mvc5</PackageTags>
16+
<PackageLicenseUrl>https://github.com/mcintyre321/mvc.jquery.datatables/blob/master/License.txt</PackageLicenseUrl>
17+
</PropertyGroup>
18+
19+
<ItemGroup>
20+
<PackageReference Include="Microsoft.AspNet.Mvc" version="5.2.3" />
21+
<PackageReference Include="Microsoft.AspNet.Razor" Version="3.2.3" />
22+
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.3" />
23+
<PackageReference Include="Microsoft.AspNet.WebPages" Version="3.2.3" />
24+
<PackageReference Include="Microsoft.Web.Infrastructure" Version="1.0.0.0" />
25+
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
26+
</ItemGroup>
27+
28+
<ItemGroup>
29+
<ProjectReference Include="..\Mvc.JQuery.DataTables.Common\Mvc.JQuery.DataTables.Common.csproj" />
30+
</ItemGroup>
31+
32+
<ItemGroup>
33+
<Reference Include="System.Web" />
34+
</ItemGroup>
35+
36+
</Project>
Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Web.Http.Controllers;
3+
using System.Web.Http.ModelBinding;
24
using System.Web.Mvc;
35
using Mvc.JQuery.DataTables;
46

@@ -7,12 +9,17 @@ namespace Mvc.JQuery.DataTables
79
/// <summary>
810
/// Model binder for datatables.js parameters a la http://geeksprogramando.blogspot.com/2011/02/jquery-datatables-plug-in-with-asp-mvc.html
911
/// </summary>
10-
public class DataTablesModelBinder : IModelBinder
12+
public class DataTablesModelBinder : System.Web.Mvc.IModelBinder, System.Web.Http.ModelBinding.IModelBinder
1113
{
12-
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
14+
public object BindModel(ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
1315
{
14-
var valueProvider = bindingContext.ValueProvider;
15-
int columns = GetValue<int>(valueProvider, "iColumns");
16+
IGenericValueProvider valueProvider = new MvcValueProvider(bindingContext.ValueProvider);
17+
return Bind(valueProvider);
18+
}
19+
20+
private object Bind(IGenericValueProvider valueProvider)
21+
{
22+
int columns = valueProvider.GetValue<int>("iColumns");
1623
if (columns == 0)
1724
{
1825
return BindV10Model(valueProvider);
@@ -23,40 +30,40 @@ public object BindModel(ControllerContext controllerContext, ModelBindingContext
2330
}
2431
}
2532

26-
private object BindV10Model(IValueProvider valueProvider)
33+
private object BindV10Model(IGenericValueProvider valueProvider)
2734
{
2835
DataTablesParam obj = new DataTablesParam();
29-
obj.iDisplayStart = GetValue<int>(valueProvider, "start");
30-
obj.iDisplayLength = GetValue<int>(valueProvider, "length");
31-
obj.sSearch = GetValue<string>(valueProvider, "search[value]");
32-
obj.bEscapeRegex = GetValue<bool>(valueProvider, "search[regex]");
33-
obj.sEcho = GetValue<int>(valueProvider, "draw");
36+
obj.iDisplayStart = valueProvider.GetValue<int>( "start");
37+
obj.iDisplayLength = valueProvider.GetValue<int>( "length");
38+
obj.sSearch = valueProvider.GetValue<string>( "search[value]");
39+
obj.bEscapeRegex = valueProvider.GetValue<bool>( "search[regex]");
40+
obj.sEcho = valueProvider.GetValue<int>( "draw");
3441

3542
int colIdx = 0;
3643
while (true)
3744
{
3845
string colPrefix = String.Format("columns[{0}]", colIdx);
39-
string colName = GetValue<string>(valueProvider, colPrefix+"[data]");
46+
string colName = valueProvider.GetValue<string>( colPrefix+"[data]");
4047
if (String.IsNullOrWhiteSpace(colName)) {
4148
break;
4249
}
4350
obj.sColumnNames.Add(colName);
44-
obj.bSortable.Add(GetValue<bool>(valueProvider, colPrefix+"[orderable]"));
45-
obj.bSearchable.Add(GetValue<bool>(valueProvider, colPrefix+"[searchable]"));
46-
obj.sSearchValues.Add(GetValue<string>(valueProvider, colPrefix+"[search][value]"));
47-
obj.bEscapeRegexColumns.Add(GetValue<bool>(valueProvider, colPrefix+"[searchable][regex]"));
51+
obj.bSortable.Add(valueProvider.GetValue<bool>( colPrefix+"[orderable]"));
52+
obj.bSearchable.Add(valueProvider.GetValue<bool>( colPrefix+"[searchable]"));
53+
obj.sSearchValues.Add(valueProvider.GetValue<string>( colPrefix+"[search][value]"));
54+
obj.bEscapeRegexColumns.Add(valueProvider.GetValue<bool>( colPrefix+"[searchable][regex]"));
4855
colIdx++;
4956
}
5057
obj.iColumns = colIdx;
5158
colIdx = 0;
5259
while (true)
5360
{
5461
string colPrefix = String.Format("order[{0}]", colIdx);
55-
int? orderColumn = GetValue<int?>(valueProvider, colPrefix+"[column]");
62+
int? orderColumn = valueProvider.GetValue<int?>( colPrefix+"[column]");
5663
if (orderColumn.HasValue)
5764
{
5865
obj.iSortCol.Add(orderColumn.Value);
59-
obj.sSortDir.Add(GetValue<string>(valueProvider, colPrefix+"[dir]"));
66+
obj.sSortDir.Add(valueProvider.GetValue<string>( colPrefix+"[dir]"));
6067
colIdx++;
6168
}
6269
else
@@ -68,35 +75,35 @@ private object BindV10Model(IValueProvider valueProvider)
6875
return obj;
6976
}
7077

71-
private DataTablesParam BindLegacyModel(IValueProvider valueProvider, int columns)
78+
private DataTablesParam BindLegacyModel(IGenericValueProvider valueProvider, int columns)
7279
{
7380
DataTablesParam obj = new DataTablesParam(columns);
7481

75-
obj.iDisplayStart = GetValue<int>(valueProvider, "iDisplayStart");
76-
obj.iDisplayLength = GetValue<int>(valueProvider, "iDisplayLength");
77-
obj.sSearch = GetValue<string>(valueProvider, "sSearch");
78-
obj.bEscapeRegex = GetValue<bool>(valueProvider, "bEscapeRegex");
79-
obj.iSortingCols = GetValue<int>(valueProvider, "iSortingCols");
80-
obj.sEcho = GetValue<int>(valueProvider, "sEcho");
82+
obj.iDisplayStart = valueProvider.GetValue<int>( "iDisplayStart");
83+
obj.iDisplayLength = valueProvider.GetValue<int>( "iDisplayLength");
84+
obj.sSearch = valueProvider.GetValue<string>( "sSearch");
85+
obj.bEscapeRegex = valueProvider.GetValue<bool>( "bEscapeRegex");
86+
obj.iSortingCols = valueProvider.GetValue<int>( "iSortingCols");
87+
obj.sEcho = valueProvider.GetValue<int>( "sEcho");
8188

8289
for (int i = 0; i < obj.iColumns; i++)
8390
{
84-
obj.bSortable.Add(GetValue<bool>(valueProvider, "bSortable_" + i));
85-
obj.bSearchable.Add(GetValue<bool>(valueProvider, "bSearchable_" + i));
86-
obj.sSearchValues.Add(GetValue<string>(valueProvider, "sSearch_" + i));
87-
obj.bEscapeRegexColumns.Add(GetValue<bool>(valueProvider, "bEscapeRegex_" + i));
88-
obj.iSortCol.Add(GetValue<int>(valueProvider, "iSortCol_" + i));
89-
obj.sSortDir.Add(GetValue<string>(valueProvider, "sSortDir_" + i));
91+
obj.bSortable.Add(valueProvider.GetValue<bool>( "bSortable_" + i));
92+
obj.bSearchable.Add(valueProvider.GetValue<bool>( "bSearchable_" + i));
93+
obj.sSearchValues.Add(valueProvider.GetValue<string>( "sSearch_" + i));
94+
obj.bEscapeRegexColumns.Add(valueProvider.GetValue<bool>( "bEscapeRegex_" + i));
95+
obj.iSortCol.Add(valueProvider.GetValue<int>( "iSortCol_" + i));
96+
obj.sSortDir.Add(valueProvider.GetValue<string>( "sSortDir_" + i));
9097
}
9198
return obj;
9299
}
93-
94-
private static T GetValue<T>(IValueProvider valueProvider, string key)
100+
101+
public bool BindModel(HttpActionContext actionContext, System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
95102
{
96-
ValueProviderResult valueResult = valueProvider.GetValue(key);
97-
return (valueResult==null)
98-
? default(T)
99-
: (T)valueResult.ConvertTo(typeof(T));
103+
IGenericValueProvider valueProvider = new WebApiValueProvider(bindingContext.ValueProvider);
104+
bindingContext.Model = Bind(valueProvider);
105+
return true;
106+
100107
}
101108
}
102109
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Mvc.JQuery.DataTables
2+
{
3+
public interface IGenericValueProvider
4+
{
5+
T GetValue<T>(string v);
6+
}
7+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Web.Mvc;
7+
8+
namespace Mvc.JQuery.DataTables
9+
{
10+
public class MvcValueProvider : IGenericValueProvider
11+
{
12+
private IValueProvider _valueProvider;
13+
14+
public MvcValueProvider(System.Web.Mvc.IValueProvider valueProvider)
15+
{
16+
this._valueProvider = valueProvider;
17+
}
18+
public T GetValue<T>(string key)
19+
{
20+
ValueProviderResult valueResult = _valueProvider.GetValue(key);
21+
return (valueResult == null)
22+
? default(T)
23+
: (T)valueResult.ConvertTo(typeof(T));
24+
}
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Web.Http.ValueProviders;
7+
8+
namespace Mvc.JQuery.DataTables
9+
{
10+
public class WebApiValueProvider : IGenericValueProvider
11+
{
12+
private IValueProvider _valueProvider;
13+
14+
public WebApiValueProvider(IValueProvider valueProvider)
15+
{
16+
this._valueProvider = valueProvider;
17+
}
18+
public T GetValue<T>(string key)
19+
{
20+
ValueProviderResult valueResult = _valueProvider.GetValue(key);
21+
return (valueResult == null)
22+
? default(T)
23+
: (T)valueResult.ConvertTo(typeof(T));
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)