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..a796013 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,9 @@ public string JsOptionsString
{
get
{
- return (new JavaScriptSerializer()).Serialize((object)JsOptions).TrimStart('{').TrimEnd('}');
+ // Doing this way to ensure Dictionary will be converted to Json in correct format
+ var optionsDict = new Dictionary(JsOptions);
+ return (new JavaScriptSerializer()).Serialize((object)optionsDict).TrimStart('{').TrimEnd('}');
}
}
@@ -111,12 +114,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)
@@ -158,18 +163,42 @@ public TTarget None()
private void AddRule(string result)
{
+ if (this._jsOptions != null && this._jsOptions.Count > 0)
+ {
+ var _jsOptionsAsJson = (new JavaScriptSerializer()).Serialize((object)this._jsOptions).TrimStart('{').TrimEnd('}');
+ 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)
+ {
+ // Doing this way because RouteValueDictionary converts to Json in wrong format
+ IDictionary optionsDict = new Dictionary(new RouteValueDictionary(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)
+ {
+ // Doing this way because RouteValueDictionary converts to Json in wrong format
+ IDictionary optionsDict = new Dictionary(new RouteValueDictionary(jsOptions));
+ return FilterOn(columnName, optionsDict);
+ }
+ public _FilterOn FilterOn(string columnName, IDictionary jsOptions)
+ {
+ return new _FilterOn(this, this.FilterTypeRules, (c, t) => c == columnName, jsOptions);
}
-
}
public class FilterRuleList : List>