// Turns the Ajax call parameters into a DataTableParameter object // Permission to use this code for any purpose and without fee is hereby granted. // No warrantles. using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json.Linq; namespace DataTables { public class DataTableParameters { public Dictionary Columns; public int Draw; public int Length; public Dictionary Order; public bool SearchRegex; public string SearchValue; public int Start; private DataTableParameters() { } /// /// Retrieve DataTable parameters from WebMethod parameter, sanitized against parameter spoofing /// /// /// public static DataTableParameters Get(object input) { return Get(JObject.FromObject(input)); } /// /// Retrieve DataTable parameters from JSON, sanitized against parameter spoofing /// /// JToken object /// parameters public static DataTableParameters Get(JToken input) { return new DataTableParameters { Columns = DataTableColumn.Get(input), Order = DataTableOrder.Get(input), Draw = (int)input["draw"], Start = (int)input["start"], Length = (int)input["length"], SearchValue = new string( ((string)input["search"]["value"]).Where( c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray()), SearchRegex = (bool)input["search"]["regex"] }; } } public class DataTableColumn { public int Data; public string Name; public bool Orderable; public bool Searchable; public bool SearchRegex; public string SearchValue; private DataTableColumn() { } /// /// Retrieve the DataTables Columns dictionary from a JSON parameter list /// /// JToken object /// Dictionary of Column elements public static Dictionary Get(JToken input) { return ( (JArray)input["columns"]) .Select(col => new DataTableColumn { Data = (int)col["data"], Name = new string( ((string)col["name"]).Where( c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray()), Searchable = (bool)col["searchable"], Orderable = (bool)col["orderable"], SearchValue = new string( ((string)col["search"]["value"]).Where( c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray()), SearchRegex = (bool)col["search"]["regex"] }) .ToDictionary(c => c.Data); } } public class DataTableOrder { public int Column; public string Direction; private DataTableOrder() { } /// /// Retrieve the DataTables order dictionary from a JSON parameter list /// /// JToken object /// Dictionary of Order elements public static Dictionary Get(JToken input) { return ( (JArray)input["order"]) .Select(col => new DataTableOrder { Column = (int)col["column"], Direction = ((string)col["dir"]).StartsWith("desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC" }) .ToDictionary(c => c.Column); } } }