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>