From b427088b572321e9134c9c45215fd4d044456c3a Mon Sep 17 00:00:00 2001 From: Alex Belozerov Date: Mon, 1 Apr 2013 14:41:02 +0700 Subject: [PATCH] jsOptions parameter is added to FilterOn. Example updated --- .../Views/Home/Index.cshtml | 8 ++- Mvc.JQuery.Datatables/DataTableVm.cs | 52 +++++++++++++++++-- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml b/Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml index e3977ce..4dbf507 100644 --- a/Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml +++ b/Mvc.JQuery.Datatables.Example/Views/Home/Index.cshtml @@ -48,6 +48,10 @@ can also use

Voila

+
+ Custom placement for Position filter: +
+
@using Mvc.JQuery.Datatables @using Mvc.JQuery.Datatables.Example.Controllers @@ -56,7 +60,7 @@ can also use //vm.JsOptions.Add("iDisplayLength", 25); //vm.JsOptions.Add("aLengthMenu", new object[] { new[] {5, 10, 25, 250, -1} , new object[] { 5, 10, 25, 250, "All"} }); vm.ColumnFilter = true; - vm.FilterOn("Position").Select("Engineer", "Tester", "Manager") + vm.FilterOn("Position", new { sSelector = "#custom-filter-placeholder-position" }).Select("Engineer", "Tester", "Manager") .FilterOn("Id").NumberRange(); //.FilterOn("Number").CheckBoxes(Enum.GetNames(typeof(Numbers))); } @@ -69,3 +73,5 @@ can also use + + diff --git a/Mvc.JQuery.Datatables/DataTableVm.cs b/Mvc.JQuery.Datatables/DataTableVm.cs index d0ab653..be22be5 100644 --- a/Mvc.JQuery.Datatables/DataTableVm.cs +++ b/Mvc.JQuery.Datatables/DataTableVm.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Web.Routing; using System.Web.Script.Serialization; namespace Mvc.JQuery.Datatables @@ -54,7 +55,7 @@ public string JsOptionsString { get { - return (new JavaScriptSerializer()).Serialize((object)JsOptions).TrimStart('{').TrimEnd('}'); + return convertDictionaryToJsonBody(JsOptions); } } @@ -111,12 +112,14 @@ public class _FilterOn private readonly TTarget _target; private readonly FilterRuleList _list; private readonly Func _predicate; + private readonly IDictionary _jsOptions; - public _FilterOn(TTarget target, FilterRuleList list, Func predicate) + public _FilterOn(TTarget target, FilterRuleList list, Func predicate, IDictionary jsOptions) { _target = target; _list = list; _predicate = predicate; + _jsOptions = jsOptions; } public TTarget Select(params string[] options) @@ -150,6 +153,12 @@ public TTarget CheckBoxes(params string[] options) return _target; } + public TTarget Text() + { + AddRule("{type: 'text'}"); + return _target; + } + public TTarget None() { AddRule("null"); @@ -158,18 +167,53 @@ public TTarget None() private void AddRule(string result) { + if (result != "null" && this._jsOptions != null && this._jsOptions.Count > 0) + { + var _jsOptionsAsJson = DataTableVm.convertDictionaryToJsonBody(this._jsOptions); + result = result.TrimEnd('}') + ", " + _jsOptionsAsJson + "}"; + } _list.Insert(0, (c, t) => _predicate(c, t) ? result : null); } } public _FilterOn FilterOn() { - return new _FilterOn(this, this.FilterTypeRules, (c, t) => t == typeof(T)); + return FilterOn(null); + } + public _FilterOn FilterOn(object jsOptions) + { + IDictionary optionsDict = DataTableVm.convertObjectToDictionary(jsOptions); + return FilterOn(optionsDict); + } + public _FilterOn FilterOn(IDictionary jsOptions) + { + return new _FilterOn(this, this.FilterTypeRules, (c, t) => t == typeof(T), jsOptions); } public _FilterOn FilterOn(string columnName) { - return new _FilterOn(this, this.FilterTypeRules, (c, t) => c == columnName); + return FilterOn(columnName, null); + } + public _FilterOn FilterOn(string columnName, object jsOptions) + { + IDictionary optionsDict = DataTableVm.convertObjectToDictionary(jsOptions); + return FilterOn(columnName, optionsDict); + } + public _FilterOn FilterOn(string columnName, IDictionary jsOptions) + { + return new _FilterOn(this, this.FilterTypeRules, (c, t) => c == columnName, jsOptions); + } + + private static string convertDictionaryToJsonBody(IDictionary dict) + { + // Converting to System.Collections.Generic.Dictionary<> to ensure Dictionary will be converted to Json in correct format + var dictSystem = new Dictionary(dict); + return (new JavaScriptSerializer()).Serialize((object)dictSystem).TrimStart('{').TrimEnd('}'); } + private static IDictionary convertObjectToDictionary(object obj) + { + // Doing this way because RouteValueDictionary converts to Json in wrong format + return new Dictionary(new RouteValueDictionary(obj)); + } } public class FilterRuleList : List>