ASP.Net MVC+Data Table實(shí)現(xiàn)分頁(yè)+排序功能的方法
本文實(shí)例講述了ASP.Net MVC+Data Table實(shí)現(xiàn)分頁(yè)+排序功能的方法。分享給大家供大家參考,具體如下:
實(shí)現(xiàn)思路:
使用datatable內(nèi)置的分頁(yè),排序
使用attribute+反射來(lái)控制需要排序和顯示的字段以及順序
分離排序和顯示邏輯
若要添加搜索邏輯只需要傳遞搜索的字段到后端即可(js初始化時(shí)把"searching": false拿掉)。
View :
@using BCMS.BusinessLogic
@using BCMS.BusinessLogic.Models
@model List<BusCaptainObj>
<table id="tblData" class="table table-striped">
<thead>
<tr class="data-list">
<th style="width:10%;">@Html.DisplayNameFor(model => model.First().PersNo)</th>
<th style="width:30%;">@Html.DisplayNameFor(model => model.First().Personnel_Name)</th>
<th style="width:20%;">@Html.DisplayNameFor(model => model.First().Position)</th>
<th style="width:20%;">@Html.DisplayNameFor(model => model.First().Interchange)</th>
<th style="width:20%;">Action</th>
</tr>
</thead>
</table>
@section scripts {
<script type="text/javascript">
@{
var columns = DataTableHelper.DisplayColumns<BusCaptainObj>();
}
$(document).ready(function () {
$('#tblData').dataTable({
"processing": true,
"serverSide": true,
"searching": false,
"stateSave": true,
"oLanguage": { "sInfoFiltered": "" },
"ajax": {
"url": @Url.Action("GetJsonData"),
"type": "GET"
},
"columns": [
{ "data": "@columns[0]" },
{ "data": "@columns[1]" },
{ "data": "@columns[2]" },
{ "data": "@columns[3]" },
{
"data": "@columns[0]",
"orderable": false,
"searchable": false,
"render": function (data, type, full, meta) {
if (type === 'display') {
return GetDetailButton("/BusCaptain/Detail?bcId=", data) + GetInfoButton("/Telematics?bcId=", data, "Performance");
} else { return data; }
}
}
],
"order": [[0, "asc"]]
});
});
</script>
}
Controller :
public ActionResult GetJsonData(int draw, int start, int length)
{
string search = Request.QueryString[DataTableQueryString.Searching];
string sortColumn = "";
string sortDirection = "asc";
if (Request.QueryString[DataTableQueryString.OrderingColumn] != null)
{
sortColumn = GetSortColumn(Request.QueryString[DataTableQueryString.OrderingColumn]);
}
if (Request.QueryString[DataTableQueryString.OrderingDir] != null)
{
sortDirection = Request.QueryString[DataTableQueryString.OrderingDir];
}
DataTableData dataTableData = new DataTableData();
dataTableData.draw = draw;
int recordsFiltered = 0;
dataTableData.data = BusCaptainService.Instance.SearchMyBuscaptains(User.Identity.Name, out recordsFiltered, start, length, sortColumn, sortDirection, search).Data;
dataTableData.recordsFiltered = recordsFiltered;
return Json(dataTableData, JsonRequestBehavior.AllowGet);
}
public string GetSortColumn(string sortColumnNo)
{
var name = DataTableHelper.SoringColumnName<BusCaptainObj>(sortColumnNo);
return name;
}
public class DataTableData
{
public int draw { get; set; }
public int recordsFiltered { get; set; }
public List<BusCaptainObj> data { get; set; }
}
Model :
class XXX{
...
[DisplayColumn(0)]
[SortingColumn(0)]
public int? A { get; set; }
[DisplayColumn(1)]
[SortingColumn(1)]
public string B { get; set; }
...
}
Helper class :
public class SortingColumnAttribute : Attribute
{
public int Index { get; }
public SortingColumnAttribute(int index)
{
Index = index;
}
}
public class DisplayColumnAttribute : Attribute
{
public int Index { get; }
public DisplayColumnAttribute(int index)
{
Index = index;
}
}
public static class DataTableQueryString
{
public static string OrderingColumn = "order[0][column]";
public static string OrderingDir = "order[0][dir]";
public static string Searching = "search[value]";
}
public static class DataTableHelper
{
public static IList<string> DisplayColumns<T>()
{
var result = new Dictionary<int, string>();
var props = typeof(T).GetProperties();
foreach (var propertyInfo in props)
{
var propAttr =
propertyInfo
.GetCustomAttributes(false)
.OfType<DisplayColumnAttribute>()
.FirstOrDefault();
if (propAttr != null)
{
result.Add(propAttr.Index,propertyInfo.Name);
}
}
return result.OrderBy(x => x.Key).Select(x => x.Value).ToList();
}
public static string SoringColumnName<T>(string columnIndex)
{
int index;
if (!int.TryParse(columnIndex, out index))
{
throw new ArgumentOutOfRangeException();
}
return SoringColumnName<T>(index);
}
public static string SoringColumnName<T>(int index)
{
var props = typeof(T).GetProperties();
foreach (var propertyInfo in props)
{
var propAttr =
propertyInfo
.GetCustomAttributes(false)
.OfType<SortingColumnAttribute>()
.FirstOrDefault();
if (propAttr != null && propAttr.Index == index)
{
return propertyInfo.Name;
}
}
return "";
}
}
Query:
...
var query = context.BusCaptains
.Where(x => ...)
.OrderByEx(sortDirection, sortField)
.Skip(start)
.Take(pageSize);
...
LINQ Helper :
...
public static IQueryable<T> OrderByEx<T>(this IQueryable<T> q, string direction, string fieldName)
{
try
{
var customProperty = typeof(T).GetCustomAttributes(false).OfType<ColumnAttribute>().FirstOrDefault();
if (customProperty != null)
{
fieldName = customProperty.Name;
}
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, fieldName);
var exp = Expression.Lambda(prop, param);
string method = direction.ToLower() == "asc" ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] {q.ElementType, exp.Body.Type};
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
catch (Exception ex)
{
_log.ErrorFormat("error form OrderByEx.");
_log.Error(ex);
throw ;
}
}
...
更多關(guān)于asp.net相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《asp.net優(yōu)化技巧總結(jié)》、《asp.net字符串操作技巧匯總》、《asp.net操作XML技巧總結(jié)》、《asp.net文件操作技巧匯總》、《asp.net ajax技巧總結(jié)專題》及《asp.net緩存操作技巧總結(jié)》。
希望本文所述對(duì)大家asp.net程序設(shè)計(jì)有所幫助。
- Asp.Net MVC 分頁(yè)、檢索、排序整體實(shí)現(xiàn)代碼
- ASP.NET MVC分頁(yè)和排序功能實(shí)現(xiàn)
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
- ASP.NET MVC4 HtmlHelper擴(kuò)展類,實(shí)現(xiàn)分頁(yè)功能
- ASP.NET MVC4 Razor模板簡(jiǎn)易分頁(yè)效果
- ASP.NET同步分頁(yè)MvcPager使用詳解
- asp.net MVC分頁(yè)代碼分享
- ASP.NET MVC分頁(yè)的實(shí)現(xiàn)方法
- ASP.NET MVC分頁(yè)控件
相關(guān)文章
asp.net用url重寫URLReWriter實(shí)現(xiàn)任意二級(jí)域名 高級(jí)篇
Asp.net 用url重寫(URLReWriter)實(shí)現(xiàn)任意二級(jí)域名,需要的朋友可以參考下,建議先看一下上一篇文章。2009-11-11
.NET微信公眾號(hào)開發(fā)之準(zhǔn)備工作
本文是.NET微信公眾號(hào)開發(fā)系列文章的第一篇,主要給大家簡(jiǎn)單介紹下微信公眾號(hào)的一些操作,有需要的小伙伴可以參考下。2015-07-07
ASP.NET實(shí)現(xiàn)偽靜態(tài)網(wǎng)頁(yè)方法小結(jié)
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)偽靜態(tài)網(wǎng)頁(yè)方法小結(jié),主要包括了利用Httphandler實(shí)現(xiàn)URL重寫、地址重寫、利用Mircosoft URLRewriter.dll實(shí)現(xiàn)頁(yè)面?zhèn)戊o態(tài)等,需要的朋友可以參考下2014-09-09
ASP.NET數(shù)據(jù)庫(kù)緩存依賴實(shí)例分析
這篇文章主要介紹了ASP.NET數(shù)據(jù)庫(kù)緩存依賴,以實(shí)例的形式分析總結(jié)了數(shù)據(jù)庫(kù)緩存依賴的原理與用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
asp.net mvc webapi 實(shí)用的接口加密方法示例
本篇文章主要介紹了asp.net mvc webapi 實(shí)用的接口加密方法示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Visual?Studio?2022?MAUI?NU1105(NETSDK1005)?問(wèn)題處理記錄
某一天修改了幾行代碼后,突然項(xiàng)目無(wú)法編譯了,提示NU1105錯(cuò)誤,這篇文章主要介紹了Visual?Studio?2022?MAUI?NU1105(NETSDK1005)?處理記錄,需要的朋友可以參考下2022-12-12
asp.net在Repeater嵌套的Repeater中使用復(fù)選框詳解
這篇文章主要介紹了asp.net在Repeater嵌套的Repeater中使用復(fù)選框,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

