JQuery DataTables ASP.NET MVC的库

我想在我的ASP.NET MVC 5项目中使用jQuery DataTables。

我确实使用了数据表并且它的工作完全正常,但问题是我不得不手动设置filter和查询,我感觉我试图在mvc中实现数据表的方式不太对。 是的我确实得到了结果,但我想遵循和标准加上我想要的东西,我不必一次又一次地输入filter和分页代码,我只发送参数到某个函数或类,我得到结果。

这就是为什么我试图寻找一些带有适当文档的数据表库。

当我遇到这个图书馆时。

https://github.com/ALMMa/datatables.mvc 

但是没有好的文档可以让我理解该库中究竟发生了什么,或者如何使用该库?

是的我试过那个库,但是由于缺乏c#和asp.net的知识,我不明白如何实现它,我找不到任何与这个库相关的例子,我可以理解这个库的工作..

然而,我也偶然发现了这个记录良好的过程。

 http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Part 

它确实很有效,因为它们提供了如何实施的非常详细的解释。

我制作了我的控制器代码。

 public ActionResult Index(jQueryDataTableParamModel param = null) { if (Request.IsAjaxRequest() && param != null) { var allCategories = _db.Categories.ToList(); IEnumerable categories; var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]); var sortDirection = Request["sSortDir_0"]; // asc or desc Func orderingFunction = (c => sortColumnIndex==1? c.Name : sortColumnIndex==2? c.SortOrder.ToString(): c.Status.ToString()); if (!string.IsNullOrEmpty(param.sSearch)) { if(sortDirection == "desc"){ categories = (from category in allCategories where category.Name.ToLower().Contains(param.sSearch.ToLower()) select category).OrderByDescending(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength); } else { categories = (from category in allCategories where category.Name.ToLower().Contains(param.sSearch.ToLower()) select category).OrderBy(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength); } } else { if (sortDirection == "desc") { categories = (from category in allCategories select category).OrderByDescending(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength); } else{ categories = (from category in allCategories select category).OrderBy(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength); } } var actionButtons = "
"+ ""; return Json(new { sEcho = param.sEcho, iTotalRecords = categories.Count(), iTotalDisplayRecords = categories.Count(), aaData = (from category in categories select new[] { category.CategoryID.ToString(), category.Name, category.SortOrder.ToString(), actionButtons }).ToArray() }, JsonRequestBehavior.AllowGet); } return View(); }

但正如你所看到的,如果有更多的数据表方法,现在只有1种方法中有很多代码,我将不得不一次又一次地编写所有代码。 所以我可以制作某种常见的数据表类或函数,并通过提供一些参数调用它,我得到了所需的结果。

我没有ASP.NET MVC5或C#的经验,有些日子我正在研究MVC 5.所以,如果有更好的方法来实现我在我的代码中实现的结果,请分享一下,任何建议你我想你认为对于数据表应该对我很好。

我正在使用自定义模型绑定器和JsonConverter(用于JSON.NET):

包含数据表请求的模型示例:

 public class MyModel { [JsonConverter(typeof(DataTableConverter))] public DataTableRequest DataTableRequest { get; set; } // other properties } 

然后动作方法将如下所示:

 [HttpPost] public virtual ActionResult GetDataTableData(MyModel myModel) { } 

数据表DataTableRequest类。 GetOrderByExpression返回Dynamic Linq表达式:

 public class DataTableRequest { public int PageIndex { get; private set; } public int PageSize { get; private set; } public string Search { get; private set; } private List SortingColumns { get; set; } public int SEcho { get; private set; } public DataTableRequest(int pageIndex, int pageSize, string search, List sortingColumns, int sEcho) { PageIndex = pageIndex; PageSize = pageSize; Search = search; SortingColumns = sortingColumns; SEcho = sEcho; } public string GetOrderByExpression() { // could be passed to EntityFramework with DynamicLinq like query.OrderBy(dataTableRequest.GetOrderByExpression()) var columnDirectionPairs = SortingColumns.Select(c => Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(c.Column.Replace("_", ".")) + " " + c.Direction); var orderByExpression = string.Join(", ", columnDirectionPairs); return orderByExpression; } public class SortBy { public SortBy(string column, string direction) { Guard.ArgumentNotNullOrEmpty(column, "column"); Guard.ArgumentNotNullOrEmpty(direction, "direction"); Column = column; Direction = direction; } public string Column { get; set; } public string Direction { get; set; } } } 

数据表转换器(用于序列化为json):

 public class DataTableConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(DataTableRequest); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jArray = JArray.Load(reader); var tableValueCollection = jArray.Select(x => new { Name = x["name"].Value(), Value = x["value"].Value() }).ToDictionary(x => x.Name, x => x.Value); var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture); var columns = new List(); for (int i = 0; i < numberOfColumns; i++) { var queryParamName = string.Format("mDataProp_{0}", i.ToString(CultureInfo.InvariantCulture)); columns.Add(tableValueCollection[queryParamName]); } var numberOfSortingColumns = int.Parse(tableValueCollection["iSortingCols"], CultureInfo.InvariantCulture); var sortingColumns = new List(); for (int i = 0; i < numberOfSortingColumns; i++) { var sortColQueryParamName = string.Format("iSortCol_{0}", i.ToString(CultureInfo.InvariantCulture)); if (tableValueCollection[sortColQueryParamName] != null) { var sortDirQueryParamName = string.Format("sSortDir_{0}", i.ToString(CultureInfo.InvariantCulture)); var sortingDirection = tableValueCollection[sortDirQueryParamName]; var sortingColumnIndex = int.Parse(tableValueCollection[sortColQueryParamName], CultureInfo.InvariantCulture); var sortingColumnName = columns[sortingColumnIndex]; sortingColumns.Add(new DataTableRequest.SortBy(sortingColumnName, sortingDirection)); } } var displayStart = int.Parse(tableValueCollection["iDisplayStart"], CultureInfo.InvariantCulture); var displayLength = int.Parse(tableValueCollection["iDisplayLength"], CultureInfo.InvariantCulture); var pageSize = displayLength; var pageIndex = displayStart / displayLength; string search = null; if (tableValueCollection.ContainsKey("sSearch")) { search = tableValueCollection["sSearch"]; } var sEcho = int.Parse(tableValueCollection["sEcho"], CultureInfo.InvariantCulture); var dataTableRequest = new DataTableRequest(pageIndex, pageSize, search, sortingColumns, sEcho); return dataTableRequest; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

DataTableModelBinder用于反序列化DataTableRequest对象:

 public class DataTableModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var request = controllerContext.HttpContext.Request; var contentType = request.ContentType; if (!contentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) return (null); request.InputStream.Seek(0, SeekOrigin.Begin); var bodyText = new StreamReader(request.InputStream).ReadToEnd(); if (string.IsNullOrEmpty(bodyText)) return (null); var jsonObj = JObject.Parse(bodyText); var jArray = (JArray)jsonObj["aoData"]; var tableValueCollection = jArray.Select(x => new { Name = x["name"].Value(), Value = x["value"].Value() }).ToDictionary(x => x.Name, x => x.Value); var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture); var columns = new List(); for (int i = 0; i < numberOfColumns; i++) { var queryParamName = string.Format("mDataProp_{0}", i.ToString(CultureInfo.InvariantCulture)); columns.Add(tableValueCollection[queryParamName]); } var numberOfSortingColumns = int.Parse(tableValueCollection["iSortingCols"], CultureInfo.InvariantCulture); var sortingColumns = new List(); for (int i = 0; i < numberOfSortingColumns; i++) { var sortColQueryParamName = string.Format("iSortCol_{0}", i.ToString(CultureInfo.InvariantCulture)); if (tableValueCollection[sortColQueryParamName] != null) { var sortDirQueryParamName = string.Format("sSortDir_{0}", i.ToString(CultureInfo.InvariantCulture)); var sortingDirection = tableValueCollection[sortDirQueryParamName]; var sortingColumnIndex = int.Parse(tableValueCollection[sortColQueryParamName], CultureInfo.InvariantCulture); var sortingColumnName = columns[sortingColumnIndex]; sortingColumns.Add(new DataTableRequest.SortBy(sortingColumnName, sortingDirection)); } } var displayStart = int.Parse(tableValueCollection["iDisplayStart"], CultureInfo.InvariantCulture); var displayLength = int.Parse(tableValueCollection["iDisplayLength"], CultureInfo.InvariantCulture); var pageSize = displayLength; var pageIndex = displayStart / displayLength; string search = null; if (tableValueCollection.ContainsKey("sSearch")) { search = tableValueCollection["sSearch"]; } var sEcho = int.Parse(tableValueCollection["sEcho"], CultureInfo.InvariantCulture); var dataTableRequest = new DataTableRequest(pageIndex, pageSize, search, sortingColumns, sEcho); return dataTableRequest; } } 

在Global.asax.cs中的Application_Start上注册模型绑定器:

 ModelBinders.Binders.Add(typeof (DataTableRequest), new DataTableModelBinder()); 

我正在使用DataTables 1.9.4并遵循json模型绑定器:

 public class JsonModelBinder : DefaultModelBinder { public static JsonSerializerSettings GlobalSerializerSettings { get { return new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = { new IsoDateTimeConverter() } }; } } public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (!IsJSONRequest(controllerContext)) { return base.BindModel(controllerContext, bindingContext); } // Get the JSON data that's been posted var request = controllerContext.HttpContext.Request; request.InputStream.Seek(0, SeekOrigin.Begin); var streamReader = new StreamReader(request.InputStream); var jsonStringData = streamReader.ReadToEnd(); if (string.IsNullOrEmpty(jsonStringData)) return null; return JsonConvert.DeserializeObject(jsonStringData, bindingContext.ModelMetadata.ModelType, GlobalSerializerSettings); } protected static bool IsJSONRequest(ControllerContext controllerContext) { var contentType = controllerContext.HttpContext.Request.ContentType; return contentType.Contains("application/json"); } } 

替换默认模型绑定器:

 ModelBinders.Binders.DefaultBinder = new JsonModelBinder();