这就是为什么我试图寻找一些带有适当文档的数据表库.I did actually used the datatable and its working perfectly fine, but problem is i had to manually set the filter and queries, and i have a feeling the way i am trying to implement the datatables in mvc is not quite right.Yes i do get the results but i want to follow and standards plus i want something that i do not have to type the filter and pagination code again and again, i only send parameters to some function or class and i get the result.当我遇到这个图书馆时.This is why i am trying to look for some datatables library with proper documentation.As i came across this library.但是没有好的文档可以让我了解该库中真正发生的事情或如何使用该库?https://github.com/ALMMa/datatables.mvc是的,我尝试过该库,但由于缺乏 c# 和 asp.net 的知识,我不明白如何实现它,也找不到与该库相关的任何示例,我可以了解该库的工作原理..but there is no good documentation that i could understand what really is happening in that library or how to use that library?然而,我也偶然发现了这个良好的文档化过程.Yes i tried that library but due to lack of knowledge of c# and asp.net i don't understand how to implement it and i cant find any example related to this library to which i could understand the working of this library..however i also stumbled across this good documented process.效果很好,因为他们提供了关于如何实施的非常详细的解释.http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Part我的控制器代码是这样的.It did worked great as they provided a very good detailed explanation of how to implement.I made my Controller Code Something like this."+"<button class='btn btn-primary btn-gradient btn-sm' type='button'>"+"<span class='fa fa-pencil'></span>"+"</按钮>";返回 Json(新{sEcho = param.sEcho,iTotalRecords = Categories.Count(),iTotalDisplayRecords = Categories.Count(),aaData =(来自类别中的类别选择新[] { category.CategoryID.ToString(), category.Name, category.SortOrder.ToString(), actionButtons }).ToArray()},JsonRequestBehavior.AllowGet);}返回视图();}public ActionResult Index(jQueryDataTableParamModel param = null) { if (Request.IsAjaxRequest() && param != null) { var allCategories = _db.Categories.ToList(); IEnumerable<Category> categories; var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]); var sortDirection = Request["sSortDir_0"]; // asc or desc Func<Category,string> 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 = "<div class='btn-group'>"+ "<button class='btn btn-primary btn-gradient btn-sm' type='button'>"+ "<span class='fa fa-pencil'></span>"+ "</button>"; 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(); }但是正如您所看到的,如果数据表有更多方法,现在只有一种方法中有很多代码,我将不得不一遍又一遍地编写所有代码.因此,我是否可以创建某种常见的数据表类或函数,并通过提供一些参数来调用它,然后我会得到所需的结果.But as you see there is alot of code in just 1 method now if there are more methods for the datatable, i will have to write all the code again and again. so instead is it possible i make some kind of common datatables class or function and call it by providing some parameters and i get the desired result.我在 ASP.NET MVC5 或 C# 方面没有经验,有几天我在研究 MVC 5.所以如果有任何更好的方法来实现我在我的代码中实现的结果,请也分享一下关于数据表的任何您认为应该对我有用的建议.I have no experience in ASP.NET MVC5 or C# ,its been some days i am working on MVC 5. So if there are any better ways of achiving the results what i have implemented here in my code please share that too and any suggestion you think you think should be nice for me regarding the datatables.推荐答案我正在使用自定义模型绑定器和 JsonConverter(用于 JSON.NET):I'm using a custom model binder and JsonConverter (for JSON.NET):包含数据表请求的模型示例:Example of a model containing data table request:public class MyModel{ [JsonConverter(typeof(DataTableConverter))] public DataTableRequest DataTableRequest { get; set; } // other properties}然后操作方法将如下所示:then the action method will look like:[HttpPost]public virtual ActionResult GetDataTableData(MyModel myModel){}数据表DataTableRequest类.GetOrderByExpression 返回 Dynamic Linq 表达式:the data table DataTableRequest class. The GetOrderByExpression returns Dynamic Linq expression:public class DataTableRequest{ public int PageIndex { get; private set; } public int PageSize { get; private set; } public string Search { get; private set; } private List<SortBy> SortingColumns { get; set; } public int SEcho { get; private set; } public DataTableRequest(int pageIndex, int pageSize, string search, List<SortBy> 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):data table converter (used for serialization to 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<string>(), Value = x["value"].Value<string>() }).ToDictionary(x => x.Name, x => x.Value); var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture); var columns = new List<string>(); 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<DataTableRequest.SortBy>(); 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 对象:DataTableModelBinder used to deserialize DataTableRequest object: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<string>(), Value = x["value"].Value<string>() }).ToDictionary(x => x.Name, x => x.Value); var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture); var columns = new List<string>(); 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<DataTableRequest.SortBy>(); 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 上注册模型绑定器:register model binder on Application_Start in Global.asax.cs:ModelBinders.Binders.Add(typeof (DataTableRequest), new DataTableModelBinder());我正在使用 DataTables 1.9.4 和以下 json 模型绑定器:I'm using DataTables 1.9.4 and following json model binder: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(); 这篇关于用于 JQuery 数据表的库 ASP.NET MVC的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
07-22 22:42
查看更多