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处理请求的整个过程,灵活地定义系统各种 ...
随机推荐
- POJ 3154 Graveyard【多解,数论,贪心】
Graveyard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1707 Accepted: 860 Specia ...
- Vijos P1127 级数求和【模拟】
级数求和 描述 已知:Sn= 1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1<=k<=15),要求计算出一个最小的n:使得Sn ...
- noi 2016 游记
先挖个坑..这回大概不会太监吧(大雾 day -2 下午起飞的飞机,晚上到了成都..把东西扔到旅馆后就组队外出觅食了... 街上人不多,逛了半天才发现一家卖本地小吃的小店. KPM:诶诶给我来碗酸辣粉 ...
- hdu_1011(Starship Troopers) 树形dp
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意:打洞洞收集脑子,你带领一个军队,洞洞互联成一棵树,每个洞中有一些bug,要全部杀死这些虫子 ...
- HDU2008
数值统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- ThoughtWorks University之旅 —— 印度游记
ThoughtWorks University是ThoughtWorks为新加入的员工提供的入职培训项目之一,会将世界各地office新入职的员工一起带到印度浦那,参加一次为期5周的培训,内容涵盖了公 ...
- 自定义省市选择器 微信小程序多列选择器
由于微信小程序的选择器为省市区选择器共3列 如我仅需要省市2列的选择器 就需要我们另寻他法找来找去没有合适的 只能自己写了 1. 首先我们把所需要的省数据 市县数据放在一个 p_c.js 文件里面,使 ...
- Tomcat软件使用常见问题
Tomcat软件使用常见问题 tomcat软件使用的常见问题 1)闪退问题 原因:tomcat软件是java语言开发的. tomcat软件启动时,会默认到系统的环境变量中查找一个名称叫JAVA_HOM ...
- union 时只能查出一个表中的信息,另一个表只能查出字段
原因:news表中title字段的编码,与brand表中的编码不一致导致 y
- 织梦首页、列表页调用文章body内容的两种方法
http://blog.csdn.net/langyu1021/article/details/52261411 关于首页.列表页调用文章body内容的两种方法,具体方法如下: 第一种方法: {ded ...