ASP.NET MVC 5 ABP DataTables (二)
JS DataTables 这个组件绑定数据必须要有自己的返回数据格式。但是ABP返回的格式直接绑定是错误。添加DataTables JS 扩展、数据加载等。ABP 原作者已经在ABP.ZERO CORE 项目有相应的应用。
DataTable JS 扩展:
/************************************************************************
* datatables AJAX 扩展 *
*************************************************************************/
(function ($) { if (!$.fn.dataTableExt) {
return;
} var doAjax = function (listAction, requestData, callbackFunction, settings) {
var inputFilter = {}; //设置表过滤器
if (listAction.inputFilter) {
inputFilter = $.extend(inputFilter, listAction.inputFilter());
} //设置分页过滤器
if (settings.oInit.paging) {
inputFilter = $.extend(inputFilter, {
maxResultCount: requestData.length,
skipCount: requestData.start
});
} //排序过滤器
if (requestData.order && requestData.order.length > 0) {
var orderingField = requestData.order[0];
if (requestData.columns[orderingField.column].data) {
inputFilter.sorting = requestData.columns[orderingField.column].data + " " + orderingField.dir;
}
} if (listAction.ajaxFunction) {
listAction.ajaxFunction(inputFilter)
.done(function (result) {
settings.rawServerResponse = result;
callbackFunction({
recordsTotal: result.totalCount, //总数
recordsFiltered: result.totalCount,
data: result.items //数据项
});
});
}
} if (!$.fn.dataTable) {
return;
} $.extend(true, $.fn.dataTable.defaults, {
ajax: function (requestData, callbackFunction, settings) {
if (!settings) {
return;
} if (!settings.oInit) {
return;
} if (!settings.oInit.listAction) {
return;
} doAjax(settings.oInit.listAction, requestData, callbackFunction, settings);
}
});
//重新加载
$.fn.dataTable.Api.register('ajax.reloadPage()', function () {
this.ajax.reload(null, false);
}); })(jQuery);
DataTables数据加载扩展
$.extend(true, $.fn.dataTable.defaults, {
language: {
url: '/Abp/Framework/scripts/Datatables/Translations/Chinese (Simplified, China).json'
},
lengthMenu: [5, 10, 25, 50, 100, 250, 500],
pageLength: 10,
responsive: true,
searching: false,
pagingType: "bootstrap_full_number",
dom: 'rt<"bottom"ilp><"clear">',
order: []
});
语言列表
/************************************************************************
* RECORD-ACTIONS extension for datatables *
*************************************************************************/
(function ($) { if (!$.fn.dataTableExt) {
return;
} var _createDropdownItem = function (record, fieldItem) {
var $li = $('<li/>');
var $a = $('<a/>'); if (fieldItem.text) {
$a.html(fieldItem.text);
} if (fieldItem.action) {
$a.click(function (e) {
e.preventDefault(); if (!$(this).closest('li').hasClass('disabled')) {
fieldItem.action({
record: record
});
}
});
} $a.appendTo($li);
return $li;
} var _createButtonDropdown = function (record, field) {
var $container = $('<div/>')
.addClass('btn-group')
.addClass('dropdown')
.addClass('action-button'); var $dropdownButton = $('<button/>')
.html(field.text)
.addClass('dropdown-toggle')
.attr('data-toggle', 'dropdown')
.attr('aria-haspopup', 'true')
.attr('aria-expanded', 'true'); if (field.cssClass) {
$dropdownButton.addClass(field.cssClass);
} var $dropdownItemsContainer = $('<ul/>').addClass('dropdown-menu'); for (var i = 0; i < field.items.length; i++) {
var fieldItem = field.items[i]; if (fieldItem.visible && !fieldItem.visible({ record: record })) {
continue;
} var $dropdownItem = _createDropdownItem(record, fieldItem); if (fieldItem.enabled && !fieldItem.enabled({ record: record })) {
$dropdownItem.addClass('disabled');
} $dropdownItem.appendTo($dropdownItemsContainer);
} if ($dropdownItemsContainer.find('li').length > 0) {
$dropdownItemsContainer.appendTo($container);
$dropdownButton.appendTo($container);
} if ($dropdownItemsContainer.children().length === 0) {
return "";
} return $container;
}; var _createSingleButton = function (record, field) {
$(field.element).data(record); if (field.visible === undefined) {
return field.element;
} var isVisibilityFunction = typeof field.visible === "function";
if (isVisibilityFunction) {
if (field.visible()) {
return field.element;
}
} else {
if (field.visible) {
return field.element;
}
} return "";
}; var _createRowAction = function (record, field, tableInstance) {
if (field.items && field.items.length > 1) {
return _createButtonDropdown(record, field, tableInstance);
} else if (field.element) {
var $singleActionButton = _createSingleButton(record, field);
if ($singleActionButton != "") {
return $singleActionButton.clone(true);
}
} return "";
} var hideColumnWithoutRedraw = function (tableInstance, colIndex) {
tableInstance.fnSetColumnVis(colIndex, false, false);
} var hideEmptyColumn = function(cellContent, tableInstance, colIndex) {
if (cellContent == "") {
hideColumnWithoutRedraw(tableInstance, colIndex);
}
}; var renderRowActions = function (tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull) {
var columns;
if (tableInstance.aoColumns) {
columns = tableInstance.aoColumns;
} else {
columns = tableInstance.fnSettings().aoColumns;
} if (!columns) {
return;
} var cells = $(nRow).children("td"); for (var colIndex = 0; colIndex < columns.length; colIndex++) {
var column = columns[colIndex];
if (column.rowAction) {
var $actionContainer = _createRowAction(aData, column.rowAction, tableInstance);
hideEmptyColumn($actionContainer, tableInstance, colIndex); var $actionButton = $(cells[colIndex]).find(".action-button");
if ($actionButton.length === 0) {
$(cells[colIndex]).append($actionContainer);
}
}
}
}; var _existingApiRenderRowActionsFunction = $.fn.dataTableExt.oApi.renderRowActions;
$.fn.dataTableExt.oApi.renderRowActions = function (tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull) {
if (_existingApiRenderRowActionsFunction) {
_existingApiRenderRowActionsFunction(tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull);
} renderRowActions(tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull);
}; if (!$.fn.dataTable) {
return;
} var _existingDefaultFnRowCallback = $.fn.dataTable.defaults.fnRowCallback;
$.extend(true, $.fn.dataTable.defaults, {
fnRowCallback: function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
if (_existingDefaultFnRowCallback) {
_existingDefaultFnRowCallback(this, nRow, aData, iDisplayIndex, iDisplayIndexFull);
} renderRowActions(this, nRow, aData, iDisplayIndex, iDisplayIndexFull);
}
}); })(jQuery);
数据操作扩展
{
"sProcessing": "处理中...",
"sLengthMenu": "显示 _MENU_ 项结果",
"sZeroRecords": "没有匹配结果",
"sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
"sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
"sInfoFiltered": "(由 _MAX_ 项结果过滤)",
"sInfoPostFix": "",
"sSearch": "搜索:",
"sUrl": "",
"sEmptyTable": "表中数据为空",
"sLoadingRecords": "载入中...",
"sInfoThousands": ",",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "上页",
"sNext": "下页",
"sLast": "末页"
},
"oAria": {
"sSortAscending": ": 以升序排列此列",
"sSortDescending": ": 以降序排列此列"
}
}
语言 JSON
ABP应用层 (只是做了演示的Demo)
[AutoMapTo(typeof(Project))]
public class CreateProjectDto
{
public string Name { get; set; }
public string Address { get; set; }
} public class GetProjectInput : PagedAndSortedResultRequestDto, IShouldNormalize
{
public void Normalize()
{
if (string.IsNullOrEmpty(Sorting))
{
Sorting = "Name";
}
}
} [AutoMapFrom(typeof(Project)), AutoMapTo(typeof(Project))]
public class ProjectDto:EntityDto<long>
{
public string Name { get; set; }
public string Address { get; set; }
}
Dto
public interface IProjectAppService : IAsyncCrudAppService<ProjectDto, long, PagedResultRequestDto, CreateProjectDto, ProjectDto>
{
PagedResultDto<ProjectDto> GetProject(GetProjectInput dto);
}
public class ProjectAppService : AsyncCrudAppService<Project, ProjectDto, long, PagedResultRequestDto, CreateProjectDto, ProjectDto>, IProjectAppService
{
public ProjectAppService(IRepository<Project, long> repository) : base(repository)
{ } public PagedResultDto<ProjectDto> GetProject(GetProjectInput input)
{
var query = Repository.GetAllList();
var queryAllCount = query.Count; var users = query.OrderBy(o=>o.Address).Skip(input.SkipCount).Take(input.MaxResultCount)
.ToList(); var projectDotlist = ObjectMapper.Map<List<ProjectDto>>(users); return new PagedResultDto<ProjectDto>(queryAllCount, projectDotlist); }
}
AppService
ABP展示层
@section Scripts{
<script src="~/lib/datatables/datatables.all.min.js"></script>
<script src="~/lib/datatables/plugins/bootstrap/datatables.bootstrap.js"></script>
<script src="~/Abp/Framework/scripts/Datatables/datatables.ajax.js"></script>
<script src="~/Abp/Framework/scripts/Datatables/datatables.defaults.js"></script>
<script src="~/Abp/Framework/scripts/Datatables/datatables.record-actions.js"></script>
<script src="~/Views/Projects/index.js"></script>
}
@section styles
{
<link href="~/lib/datatables/datatables.min.css" rel="stylesheet" />
<link href="~/lib/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" />
}
<div class="row margin-bottom-5">
<div class="col-xs-6">
<div class="page-head">
<div class="page-title">
<h1>
<span>@L("Project")</span> <small>@L("ProjectHeaderInfo")</small>
</h1>
</div>
</div>
</div>
</div> <div class="portlet light margin-bottom-0">
<div class="portlet-title portlet-title-filter">
<div class="inputs inputs-full-width">
<div class="portlet-input">
<form>
<div class="row">
<div class="col-xs-6"> </div>
<div class="col-xs-6">
<div class="form-group">
<button id="RefreshProjectButton" class="btn btn-primary blue"><i class="fa fa-refresh"></i> @L("Refresh")</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="portlet-body">
<table id="ProjectTable" class="table table-striped table-bordered table-hover order-column">
<thead>
<tr>
<th>@L("Actions")</th>
<th>@L("RoleName")</th>
<th>@L("CreationTime")</th>
</tr>
</thead>
</table>
</div>
</div>
View
(function () {
$(function () {
var _$projectsTable = $('#projectsTable');
var _projectService = abp.services.app.project;
var dataTable = _$projectsTable.DataTable({
paging: true,
serverSide: true,
processing: false,
listAction: {
ajaxFunction: _projectService.getProject
},
columnDefs: [
{
targets: 0,
data: null,
orderable: false,
autoWidth: false,
defaultContent: '',
rowAction: {
cssClass: 'btn btn-xs btn-primary blue',
text: '<i class="fa fa-cog"></i> ' + 'Actions' + ' <span class="caret"></span>',
items: [
]
}
},
{
targets: 1,
data: "name" },
{
targets: 2,
data: "address"
}
]
});
$('#RefreshprojectsButton').click(function (e) {
e.preventDefault();
getprojects();
});
function getprojects() {
dataTable.ajax.reload();
}
});
})();
JavaScript
然后调试数据展示成功。
ASP.NET MVC 5 ABP DataTables (二)的更多相关文章
- ASP.NET MVC 5 ABP DataTables (一)
1)ABP DataTables 应用(一) 2) ABP DataTables 应用(二) JS DataTables 这个组件绑定数据必须要有自己的返回数据格式.但是ABP返回的格式直接绑定是错 ...
- Asp.net mvc 知多少(二)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- ASP.NET MVC案例教程(二)
ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- Asp.Net MVC学习总结(二)——控制器与动作(Controller And Action)
一.理解控制器 1.1.什么是控制器 控制器是包含必要的处理请求的.NET类,控制器的角色封装了应用程序逻辑,控制器主要是负责处理请求,实行对模型的操作,选择视图呈现给用户. 简单理解:实现了ICon ...
- ASP.NET MVC学习笔记(二)笔记
接下来我们一起了解ASP.NET MVC的最重要的核心技术,了解ASP.NET MVC的开发框架,生命周期,技术细节. 一.Routing与ASP.NET MVC生命周期 1.Routing——网址路 ...
- 基于ASP.NET MVC的ABP框架入门学习教程
为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...
- [译]Asp.net MVC 之 Contorllers(二)
URL路由模块 取代URL重写 路由请求 URL路由模块的内部结构 应用程序路由 URL模式和路由 定义应用程序路由 处理路由 路由处理程序 处理物理文件请求 防止路由定义的URL 属性路由 书接上回 ...
- ASP.NET MVC简单编程之(二)经典路由篇
话题:请求从路由开始 在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的.因为任何一个请求都离不开路由.理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种 ...
随机推荐
- 51 nod 1203 JZPLCM
原题链接 长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7. 例如:2 3 4 5,询问[1,3]区间的最小 ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
- BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】
1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1689 Solved: 1335[Submit][St ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- 访问 Tomcat支配项目去除项目名和端口号通过IP地址(或域名)访问
Tomcat去除项目名称和端口号 1. 去除端口号 将端口设为80: <Connector port="80" protocol="HTTP/1.1" c ...
- slice、splice与split傻傻分不清
每每看到这几个,就蒙圈了,这都是啥呀? 既然这么容易混淆,我还是来做个小笔记吧,以便日后查阅: 1.slice(数组) 定义:slice() 方法可从已有的数组中返回选定的元素. 用法:array ...
- memcached内存模型
内存管理 内存结构 把内存划分成不同的slab class仓库 把仓库切分成不同尺寸的小块(chunk),用来存储缓存数据 数据内存分配 首先根据数据的大小找到对应的slab class 找到空闲的c ...
- 云计算之路-阿里云上:节点 CPU 波动引发 docker swarm 集群故障
非常抱歉,今天 10:05-10:20 左右,我们用阿里云服务器搭建的 docker swarm 集群又出现故障,又是因为突然的节点 CPU 波动. 受这次故障影响的站点有 闪存,博问,班级,园子,短 ...
- 带您了解mysql CONCAT()函数
CONCAT()函数是mysql中非常重要的函数,可以将多个字符串连接成一个字符串,下文对该函数作了详细的阐述,希望对您有所帮助. mysql CONCAT()函数用于将多个字符串连接成一个字符串,是 ...
- dede 内容页文章标题显示不全的更改方法
找到include/taglib/arclist.lib.php 1.$titlelen = AttDef($titlelen,30);换成$titlelen = AttDef($titlelen,2 ...