ABP 初探 之基于EasyUI的CURD
结束了天天加班的项目,项目虽然结束,但还是有点小问题,只能在后期优化当中完成了,本次做项目采用了,MVC、Webapi、Entityframework,在园了里看到了有关ABP的介绍,同样ABP也是最新技术集合,就加入了 ABP架构设计交流群 134710707,一起探讨、学习与进步。
ABP的技术文档全是英文资料,不过现在不用担心了,群里的热心朋友已翻译成能看的懂语言了,详情
ABP 源代码地址 https://github.com/aspnetboilerplate
ABP的基本介绍就不讲了它是基于.net 4.5.1的,下载文档后自己了解吧,现在只讲解怎么用了
公司的项目是基于Easyui的,因此Demo也是基于EasyUI的,ABP的返回值不能满足Easyui的datagrid请求与显示,对Abp源码进行了部分修改,才能正常使用,具体修改会一一列出,给需要的朋友一点帮助。
ABP的请求值返回的对象属性首字母小写,这是因为默认的Json格式是 CamelCasePropertyNamesContractResolver ,只要把相关代码修改为
对应的类名:AbpWebApiModule
private static void InitializeFormatters()
{
GlobalConfiguration.Configuration.Formatters.Clear();
var formatter = new JsonMediaTypeFormatter();
formatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
formatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
GlobalConfiguration.Configuration.Formatters.Add(formatter);
GlobalConfiguration.Configuration.Formatters.Add(new PlainTextFormatter());
}
Easyui的Datagrid请求是通过URL传参数的,目前ABP不支持这种处理方法,因此只能自己在Controller里面写方法了,不能调用自动生成的WebAPi,多了一个步骤,下面是构造的分页类
public EasyUIPager GetPager(HttpRequestBase currentRequest)
{
EasyUIPager pager = new EasyUIPager();
if (currentRequest.Form["page"] != null)
{
pager.CurrentPage = int.Parse(currentRequest.Form["page"]);
}
if (currentRequest.Form["rows"] != null)
{
pager.PageSize = int.Parse(currentRequest.Form["rows"]);
}
pager.SortCloumnName = currentRequest.Form["sort"];
pager.SortOrder = currentRequest.Form["order"];
pager.Filter = currentRequest.Form["filter"];
return pager;
}
JS 请求调用代码
function GridInit() {
//VE.LoodToolbar(); //加载权限
datagrid = $("#datagrid").datagrid({
url: VE.AppPath + '/User/Get',
title: '用户信息',
rownumbers: true,
pagination: true,
iconCls: VE.DatagridIconCls,
height: VE.GridHeight,
pageSize: VE.PageSize,
pageList: VE.PageList,
ctrlSelect:true,
fitColumns: true,
nowrap: false,
border: true,
idField: 'Id',
sortName: 'Id',
sortOrder: 'desc',
columns: [[
{ field: 'ck', checkbox: true },
{ field: 'Id', title: 'Id', width: 80, sortable: true, hidden: true },
{ field: 'UserName', title: '用户名', width: 100, sortable: true },
{ field: 'Surname', title: '姓', width: 60, sortable: true },
{ field: 'Name', title: '名', sortable: true },
{ field: 'EmailAddress', title: '邮箱', sortable: true },
{ field: 'CreationTime', title: '创建时间', width: 140, sortable: true },
{ field: 'CreatorUserName', title: '创建人', width: 100, sortable: true },
{ field: 'LastModifierUserName', title: '最后更新人', width: 100, sortable: true },
{ field: 'LastModificationTime', title: '最后更新时间', width: 140, sortable: true, formatter: VE.FormatterDateTime },
{ field: 'IsActive', title: '状态', width: 45, sortable: true, formatter: VE.FormatterActive }
]],
toolbar: [{
iconCls: 'icon-add',
text: '新增',
handler: function () {
id = 0;
Save()
}
}, '-', {
iconCls: 'icon-edit',
text: '编辑',
handler: function () {
id = VE.Edit("datagrid", VE.GridType_DataGrid)
if (id > 0) {
Save();
}
}
}, '-', {
iconCls: 'icon-busy',
text: '删除',
handler: function () {
Delete();
}
}, '-', {
iconCls: 'icon-unlock',
text: '启用',
handler: function () {
Active(true)
}
}, '-', {
iconCls: 'icon-lock',
text: '禁用',
handler: function () {
Active(false)
}
}]
});
}
MVC Controller代码
#region 获取列表
public JsonResult Get()
{
var provider = new EasyUIProvider();
var pager = provider.GetPager(Request);
var filter = new GetUserInput();
if (!string.IsNullOrEmpty(pager.Filter))
{
filter = provider.DeserializeObject<GetUserInput>(pager.Filter);
}
filter.PageSize = pager.PageSize;
filter.CurrentPage = pager.CurrentPage - ;
filter.SortOrder = pager.SortOrder;
filter.SortCloumnName = pager.SortCloumnName;
var grid = _userApplicationService.GetUser(filter);
return Json(grid);
}
#endregion
效果图如下

关于创建人与最后更新人,ABP的处理比较好,只需要通过映射就可以了,不需要写多余的子查询,具体原理还没查看源代码,等了解后再详解

关于批量操作,一般情况下每页显示20~50条数据,简单的批量删除基本可以满足,如果需操作大量数据建议采用存储过程,修改、添加不在介绍,具体实现请参考源代码
public async Task Delete(BatchDeleteRequestInput input)
{
for (int i = ; i < input.Id.Split(',').Length; i++)
{
await _userRepository.DeleteAsync(Convert.ToInt64(input.Id.Split(',')[i]));
}
await _unitOfWorkManager.Current.SaveChangesAsync();
}
对 UserFriendlyException 的处理进行了修改,根据不同的异常 弹出不同的提示框
public UserFriendlyException(string message, UserFriendlyExceptionCode code)
: base(message)
{ if (code == UserFriendlyExceptionCode.Info)
{
Code = ;
}
else if (code == UserFriendlyExceptionCode.Warn)
{
Code = ;
}
else
{
Code = ;
}
}
EasyUI对应代码
$.ajax({
url: VE.AppPath + url,
type: 'post',
contentType: 'application/json',
data: JSON.stringify({ Id: VE.Ids.join(','), IsActive: active }),
dataType: 'json',
success: function (r) {
if (r.Success) {
VE.MessageShow("操作成功");
VE.GridJudge(gridId, isLoad, gridType);
} else {
if (r.Error.Code == ) {
$.messager.alert('提示', r.Error.Message, "error");
}
else if (r.Error.Code == ) {
$.messager.alert('提示', r.Error.Message, "info");
}
else if (r.Error.Code == ) {
$.messager.alert('提示', r.Error.Message, "warn");
} else {
$.messager.alert('提示', r.Error.Message, "error");
}
}
}
});
项目结构如下

大家都喜欢源代码,F5直接运行,因此就写了个demo供大家参考
设置 V.Market.Web 为启动项目

修改 web.config 的连接字符串
<add name="Default" connectionString="data source=.;initial catalog=Market;persist security info=True;user id=sa;password=Password!;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
有的园友没学习过EntityFramework,不知如何生成数据库,下介绍数据库的生成方法
通过命令生成数据库 update-database (需运行两次才能把数据写到数据库)

修改生成的数据 abpuser表 的 TenantId 修改成1

由于上传代码时,忘记修改登录的用户名了,因此需修改 HomeController的 登录用户名为 Admin

ABP 初探 之基于EasyUI的CURD的更多相关文章
- 基于EasyUI Treegrid的权限管理资源列表
1. 前言 最近在开发系统权限管理相关的功能,主要包含用户管理,资源管理,角色管理,组类别管理等小的模块.之前的Web开发中也用过jQueryEasyUI插件,感觉这款插件简单易用,上手很快.以前用到 ...
- 基于EasyUI实现windows桌面
之前为大家介绍了 基于jquery tool实现的windows桌面效果,今天给大家带来一款基于EasyUI实现windows桌面.这款桌面适用浏览器:360.FireFox.Chrome.Safar ...
- 基于easyui的验证扩展
基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...
- 基于easyui的webform扩展(续)
基于easyui的webform扩展(续) 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>.<基于easyui的webform扩展 ...
- 基于easyui的webform扩展
基于easyui的webform扩展 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>前两篇介绍了mvc内如何基于easyui进行扩展,在 ...
- 前端基于easyui的mvc扩展(续)
前端基于easyui的mvc扩展(续) 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题: 当我们要给生成的控件设置 ...
- 基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目
项目中我做修改用户个人资料的时候,有一个需求是帮助人员的帮助类型如图下所示: 当初想如果是asp.net控件的话应该很简单实现,如果不是基于easyUI框架那就太简单了,现在是受框架的限制与是前端ht ...
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- 前端基于easyui的mvc扩展
背景 由于MVC的前端是基于jquery.validate和jquery.validate.unobtrusive来实现的,但是当我们要使用其他的ui组件且组件本身就带有完整的验证功能的话,那么要让它 ...
随机推荐
- 神兵利器——Alfred
有人的地方就有江湖,有江湖就有纷争. 很多人说我的文字风格相对轻松和温和,那是因为我很早就认识到,我们没有教育脑残和喷子的义务.在网际多年,看过太多虚拟的刀锋和鲜血,很多人被彻头彻尾的粉碎,挫骨扬灰, ...
- TODO:关于自媒体博客改名
TODO:关于自媒体博客改名 1.微信公众号:ludong86 个人类帐号一个自然年内可主动修改两次名称 2.企鹅号 不能改帐号名称 3.简书 名称可以随意修改,但是个人主页是系统自动生成的. 4.今 ...
- Win8换成Win7系统问题小结(修改主板BIOS方法)
问题描述: 笔记本电脑W8系统使用不习惯,想要换成W7系统,但不管是用光盘安装亦或是用U盘安装,在设置系统启动项的时候,选择从光盘启动或从U盘启动,但是回车点了之后没反应. 下面就说说问题的原因及解决 ...
- promise实现原理
先看的这篇有问题的文章 花了很长时间研究这篇文章,卡在实现串行Promise那儿了,一直看不明白.就在刚才,发现这篇文章是错的,在第一次用setTimeout( ,0)那儿就错了.虽然用setTime ...
- 学习RBAC 用户·角色·权限·表
- Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理 梯度计算 基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理 梯度计算 ...
- 升级到Windows10
1.Windows10的优点 2.需要安装的软件 实用软件: Firefox浏览器 Chrome浏览器 有道云笔记 Adobe Reader Adobe Flash Adobe PhotoShop 编 ...
- Java中的网络编程
Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- Oracle库Delete删除千万以上普通堆表数据的方法
需求:Oracle数据库delete删除普通堆表千万条历史记录. 直接删除的影响: 1.可能由于undo表空间不足从而导致最终删除失败的问题: 2.可能导致undo表空间过度使用,影响到其他用户正常操 ...