11using System ;
2+ using System . Web . Http . Controllers ;
3+ using System . Web . Http . ModelBinding ;
24using System . Web . Mvc ;
35using 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}
0 commit comments