From f8dcd49a973f289cb9d805105b5b680a057d2c14 Mon Sep 17 00:00:00 2001 From: Pratik Vasani Date: Mon, 8 May 2017 12:04:23 +0100 Subject: [PATCH 1/2] Added model binder for WebApi --- .../Mvc.JQuery.DataTables.csproj | 36 +++++++++ .../DataTablesModelBinder.cs | 79 ++++++++++--------- .../IGenericValueProvider.cs | 7 ++ Mvc.JQuery.Datatables/MvcValueProvider.cs | 26 ++++++ Mvc.JQuery.Datatables/WebApiValueProvider.cs | 26 ++++++ 5 files changed, 138 insertions(+), 36 deletions(-) create mode 100644 Mvc.JQuery.DataTables/Mvc.JQuery.DataTables.csproj create mode 100644 Mvc.JQuery.Datatables/IGenericValueProvider.cs create mode 100644 Mvc.JQuery.Datatables/MvcValueProvider.cs create mode 100644 Mvc.JQuery.Datatables/WebApiValueProvider.cs diff --git a/Mvc.JQuery.DataTables/Mvc.JQuery.DataTables.csproj b/Mvc.JQuery.DataTables/Mvc.JQuery.DataTables.csproj new file mode 100644 index 0000000..db66dc4 --- /dev/null +++ b/Mvc.JQuery.DataTables/Mvc.JQuery.DataTables.csproj @@ -0,0 +1,36 @@ + + + + net451 + Mvc.JQuery.DataTables + Mvc.JQuery.DataTables + Mvc.JQuery.DataTables + + 1.0.0 + Harry McIntyre + Popular lib for using DataTables.net with IQueryable. Install this package to use with MVC5 + false + https://github.com/mcintyre321/mvc.jquery.datatables + Harry McIntyre + jquery datatables iqueryable razor asp mvc mvc5 + https://github.com/mcintyre321/mvc.jquery.datatables/blob/master/License.txt + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mvc.JQuery.Datatables/DataTablesModelBinder.cs b/Mvc.JQuery.Datatables/DataTablesModelBinder.cs index 1a6a285..106a747 100644 --- a/Mvc.JQuery.Datatables/DataTablesModelBinder.cs +++ b/Mvc.JQuery.Datatables/DataTablesModelBinder.cs @@ -1,4 +1,6 @@ using System; +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; using System.Web.Mvc; using Mvc.JQuery.DataTables; @@ -7,12 +9,17 @@ namespace Mvc.JQuery.DataTables /// /// Model binder for datatables.js parameters a la http://geeksprogramando.blogspot.com/2011/02/jquery-datatables-plug-in-with-asp-mvc.html /// - public class DataTablesModelBinder : IModelBinder + public class DataTablesModelBinder : System.Web.Mvc.IModelBinder, System.Web.Http.ModelBinding.IModelBinder { - public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) + public object BindModel(ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext) { - var valueProvider = bindingContext.ValueProvider; - int columns = GetValue(valueProvider, "iColumns"); + IGenericValueProvider valueProvider = new MvcValueProvider(bindingContext.ValueProvider); + return Bind(valueProvider); + } + + private object Bind(IGenericValueProvider valueProvider) + { + int columns = valueProvider.GetValue("iColumns"); if (columns == 0) { return BindV10Model(valueProvider); @@ -23,28 +30,28 @@ public object BindModel(ControllerContext controllerContext, ModelBindingContext } } - private object BindV10Model(IValueProvider valueProvider) + private object BindV10Model(IGenericValueProvider valueProvider) { DataTablesParam obj = new DataTablesParam(); - obj.iDisplayStart = GetValue(valueProvider, "start"); - obj.iDisplayLength = GetValue(valueProvider, "length"); - obj.sSearch = GetValue(valueProvider, "search[value]"); - obj.bEscapeRegex = GetValue(valueProvider, "search[regex]"); - obj.sEcho = GetValue(valueProvider, "draw"); + obj.iDisplayStart = valueProvider.GetValue( "start"); + obj.iDisplayLength = valueProvider.GetValue( "length"); + obj.sSearch = valueProvider.GetValue( "search[value]"); + obj.bEscapeRegex = valueProvider.GetValue( "search[regex]"); + obj.sEcho = valueProvider.GetValue( "draw"); int colIdx = 0; while (true) { string colPrefix = String.Format("columns[{0}]", colIdx); - string colName = GetValue(valueProvider, colPrefix+"[data]"); + string colName = valueProvider.GetValue( colPrefix+"[data]"); if (String.IsNullOrWhiteSpace(colName)) { break; } obj.sColumnNames.Add(colName); - obj.bSortable.Add(GetValue(valueProvider, colPrefix+"[orderable]")); - obj.bSearchable.Add(GetValue(valueProvider, colPrefix+"[searchable]")); - obj.sSearchValues.Add(GetValue(valueProvider, colPrefix+"[search][value]")); - obj.bEscapeRegexColumns.Add(GetValue(valueProvider, colPrefix+"[searchable][regex]")); + obj.bSortable.Add(valueProvider.GetValue( colPrefix+"[orderable]")); + obj.bSearchable.Add(valueProvider.GetValue( colPrefix+"[searchable]")); + obj.sSearchValues.Add(valueProvider.GetValue( colPrefix+"[search][value]")); + obj.bEscapeRegexColumns.Add(valueProvider.GetValue( colPrefix+"[searchable][regex]")); colIdx++; } obj.iColumns = colIdx; @@ -52,11 +59,11 @@ private object BindV10Model(IValueProvider valueProvider) while (true) { string colPrefix = String.Format("order[{0}]", colIdx); - int? orderColumn = GetValue(valueProvider, colPrefix+"[column]"); + int? orderColumn = valueProvider.GetValue( colPrefix+"[column]"); if (orderColumn.HasValue) { obj.iSortCol.Add(orderColumn.Value); - obj.sSortDir.Add(GetValue(valueProvider, colPrefix+"[dir]")); + obj.sSortDir.Add(valueProvider.GetValue( colPrefix+"[dir]")); colIdx++; } else @@ -68,35 +75,35 @@ private object BindV10Model(IValueProvider valueProvider) return obj; } - private DataTablesParam BindLegacyModel(IValueProvider valueProvider, int columns) + private DataTablesParam BindLegacyModel(IGenericValueProvider valueProvider, int columns) { DataTablesParam obj = new DataTablesParam(columns); - obj.iDisplayStart = GetValue(valueProvider, "iDisplayStart"); - obj.iDisplayLength = GetValue(valueProvider, "iDisplayLength"); - obj.sSearch = GetValue(valueProvider, "sSearch"); - obj.bEscapeRegex = GetValue(valueProvider, "bEscapeRegex"); - obj.iSortingCols = GetValue(valueProvider, "iSortingCols"); - obj.sEcho = GetValue(valueProvider, "sEcho"); + obj.iDisplayStart = valueProvider.GetValue( "iDisplayStart"); + obj.iDisplayLength = valueProvider.GetValue( "iDisplayLength"); + obj.sSearch = valueProvider.GetValue( "sSearch"); + obj.bEscapeRegex = valueProvider.GetValue( "bEscapeRegex"); + obj.iSortingCols = valueProvider.GetValue( "iSortingCols"); + obj.sEcho = valueProvider.GetValue( "sEcho"); for (int i = 0; i < obj.iColumns; i++) { - obj.bSortable.Add(GetValue(valueProvider, "bSortable_" + i)); - obj.bSearchable.Add(GetValue(valueProvider, "bSearchable_" + i)); - obj.sSearchValues.Add(GetValue(valueProvider, "sSearch_" + i)); - obj.bEscapeRegexColumns.Add(GetValue(valueProvider, "bEscapeRegex_" + i)); - obj.iSortCol.Add(GetValue(valueProvider, "iSortCol_" + i)); - obj.sSortDir.Add(GetValue(valueProvider, "sSortDir_" + i)); + obj.bSortable.Add(valueProvider.GetValue( "bSortable_" + i)); + obj.bSearchable.Add(valueProvider.GetValue( "bSearchable_" + i)); + obj.sSearchValues.Add(valueProvider.GetValue( "sSearch_" + i)); + obj.bEscapeRegexColumns.Add(valueProvider.GetValue( "bEscapeRegex_" + i)); + obj.iSortCol.Add(valueProvider.GetValue( "iSortCol_" + i)); + obj.sSortDir.Add(valueProvider.GetValue( "sSortDir_" + i)); } return obj; } - - private static T GetValue(IValueProvider valueProvider, string key) + + public bool BindModel(HttpActionContext actionContext, System.Web.Http.ModelBinding.ModelBindingContext bindingContext) { - ValueProviderResult valueResult = valueProvider.GetValue(key); - return (valueResult==null) - ? default(T) - : (T)valueResult.ConvertTo(typeof(T)); + IGenericValueProvider valueProvider = new WebApiValueProvider(bindingContext.ValueProvider); + bindingContext.Model = Bind(valueProvider); + return true; + } } } \ No newline at end of file diff --git a/Mvc.JQuery.Datatables/IGenericValueProvider.cs b/Mvc.JQuery.Datatables/IGenericValueProvider.cs new file mode 100644 index 0000000..16bdc91 --- /dev/null +++ b/Mvc.JQuery.Datatables/IGenericValueProvider.cs @@ -0,0 +1,7 @@ +namespace Mvc.JQuery.DataTables +{ + public interface IGenericValueProvider + { + T GetValue(string v); + } +} \ No newline at end of file diff --git a/Mvc.JQuery.Datatables/MvcValueProvider.cs b/Mvc.JQuery.Datatables/MvcValueProvider.cs new file mode 100644 index 0000000..10adaab --- /dev/null +++ b/Mvc.JQuery.Datatables/MvcValueProvider.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Mvc; + +namespace Mvc.JQuery.DataTables +{ + public class MvcValueProvider : IGenericValueProvider + { + private IValueProvider _valueProvider; + + public MvcValueProvider(System.Web.Mvc.IValueProvider valueProvider) + { + this._valueProvider = valueProvider; + } + public T GetValue(string key) + { + ValueProviderResult valueResult = _valueProvider.GetValue(key); + return (valueResult == null) + ? default(T) + : (T)valueResult.ConvertTo(typeof(T)); + } + } +} diff --git a/Mvc.JQuery.Datatables/WebApiValueProvider.cs b/Mvc.JQuery.Datatables/WebApiValueProvider.cs new file mode 100644 index 0000000..2566e7c --- /dev/null +++ b/Mvc.JQuery.Datatables/WebApiValueProvider.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http.ValueProviders; + +namespace Mvc.JQuery.DataTables +{ + public class WebApiValueProvider : IGenericValueProvider + { + private IValueProvider _valueProvider; + + public WebApiValueProvider(IValueProvider valueProvider) + { + this._valueProvider = valueProvider; + } + public T GetValue(string key) + { + ValueProviderResult valueResult = _valueProvider.GetValue(key); + return (valueResult == null) + ? default(T) + : (T)valueResult.ConvertTo(typeof(T)); + } + } +} From 71d498fdeb89690aae15bfc9454a5a1bca333f8f Mon Sep 17 00:00:00 2001 From: Pratik Vasani Date: Mon, 8 May 2017 12:07:03 +0100 Subject: [PATCH 2/2] reference --- Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj b/Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj index 6f888d0..db66dc4 100644 --- a/Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj +++ b/Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj @@ -19,6 +19,7 @@ +