Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码
2017-10-24 00:00
330 查看
关于T4代码生成这块,我之前写过几篇帖子,如:《Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)》(http://www.cnblogs.com/codelove/p/4251533.html)、《Magicodes.NET框架之路——让Magicodes.NET帮你编写代码》(http://www.cnblogs.com/codelove/p/4232659.html)。ASP.NET Scaffolding虽然有些不足,但是思虑再三,考虑到时间成本,Magicodes.WeiChat中还是采用了ASP.NET Scaffolding模板来生成业务代码。目前已经实现了创建、删除、查看、编辑、分页、搜索、删除确认、批量操作、批量删除、支持日期控件、支持多个主键等情形的代码生成。
我们先来看看效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/66d24dbd9b7b18853e53d142636144ec.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/adba63a4400ff66c73ef1239d7acdcbc.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/3a7d53a437a8ef9b350d85f094d63757.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/17b11bd929c38f27272a47877b156330.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/38ee46f13a2506551f456131e9bd2ff7.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/b605b6e9da521d77724a3e65affe8b29.jpg)
虽然ASP.NET Scaffolding Template存在一些缺陷,无法完美的实现某些代码生成的问题,但是我们目前不需要到这个级别,因此还是勉强够用了。
如下图所示,我们修改了基架模板,目
3ff0
录位置如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/d07e16096cbe6f4a70a44f16bf2b966c.png)
其中,我们需要重点关注以下两个目录:
MvcControllerWithContext:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成控制器代码的T4模板。
MvcView:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成增删改查视图的代码的T4模板。
然后,我们就开始生成之旅。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/07192a6c29642ebaf4c44257092b0999.png)
这里选择【包含视图的MVC5控制器(使用 Entity Framework)】。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/82f7927545c1819e0ac220541e641f11.png)
个人比较喜欢使用异步控制器操作。
代码中默认就实现了分页逻辑与搜索逻辑,不过搜索逻辑目前只是简单的搜索逻辑,开发者可以根据自己的需求修改为自己的搜索逻辑。
创建、编辑、删除的代码这里就略过了。这里介绍下批量操作的代码:
批量操作是很常见的一个场景,这里自动生成了批量删除的代码。当然,你也可以根据需要将此处修改为软删除。
然后视图这块,生成了批量操作的前端代码:
对于新增、编辑视图,生成了日历控件的代码,不过可以按照个人需求选择注销。
同时,模板也支持多主键代码生成,例如前端复选框选择代码:
操作代码:
然后,批量操作的方法参数也修改为string数组:
而获取批量操作的对象也根据多个主键进行了筛选:
同样的,增删等操作也进行了处理:
之所以没有沿用之前摸索出来的代码生成方式,主要是因为个人精力有限,暂时难以花费太多精力在代码生成这块。
好的架构是根据自身业务重构出来的,适合自己的架构就是好的。
在代码设计方面,本人现在更热衷于简单设计,轻架构,“简单”代码。
我们先来看看效果图:
效果图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/66d24dbd9b7b18853e53d142636144ec.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/adba63a4400ff66c73ef1239d7acdcbc.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/3a7d53a437a8ef9b350d85f094d63757.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/17b11bd929c38f27272a47877b156330.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/38ee46f13a2506551f456131e9bd2ff7.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/b605b6e9da521d77724a3e65affe8b29.jpg)
代码基架的定制与修改
关于ASP.NET代码基架的知识与操作,请阅读此处(http://www.cnblogs.com/codelove/p/4251533.html),这里就不多说了。虽然ASP.NET Scaffolding Template存在一些缺陷,无法完美的实现某些代码生成的问题,但是我们目前不需要到这个级别,因此还是勉强够用了。
如下图所示,我们修改了基架模板,目
3ff0
录位置如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/d07e16096cbe6f4a70a44f16bf2b966c.png)
其中,我们需要重点关注以下两个目录:
MvcControllerWithContext:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成控制器代码的T4模板。
MvcView:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成增删改查视图的代码的T4模板。
然后,我们就开始生成之旅。
代码生成
添加控制器,选择代码基架
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/07192a6c29642ebaf4c44257092b0999.png)
这里选择【包含视图的MVC5控制器(使用 Entity Framework)】。
添加控制器
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/82f7927545c1819e0ac220541e641f11.png)
个人比较喜欢使用异步控制器操作。
生成的代码
我们先来看看生成的列表代码:// GET: WeiChat_KeyWordTextContent public async Task<ActionResult> Index(string q, int pageIndex = 1, int pageSize = 10) { var queryable = db.WeiChat_KeyWordTextContents.Include(p => p.CreateUser).Include(p => p.UpdateUser).AsQueryable(); if (!string.IsNullOrWhiteSpace(q)) { //请替换为相应的搜索逻辑 queryable = queryable.Where(p => p.Text.Contains(q) || p.KeyWord.Contains(q) || p.CreateBy.Contains(q) || p.UpdateBy.Contains(q)); } var pagedList = new PagedList<WeiChat_KeyWordTextContent>( await queryable.OrderBy(p => p.Id) .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(), pageIndex, pageSize, await queryable.CountAsync()); return View(pagedList); }
代码中默认就实现了分页逻辑与搜索逻辑,不过搜索逻辑目前只是简单的搜索逻辑,开发者可以根据自己的需求修改为自己的搜索逻辑。
创建、编辑、删除的代码这里就略过了。这里介绍下批量操作的代码:
// POST: WeiChat_KeyWordTextContent/BatchOperation/{operation} /// <summary> /// 批量操作 /// </summary> /// <param name="operation">操作方法</param> /// <param name="ids">主键集合</param> /// <returns></returns> [HttpPost] [Route("WeiChat_KeyWordTextContent/BatchOperation/{operation}")] public async Task<ActionResult> BatchOperation(string operation, params Guid?[] ids) { var ajaxResponse = new AjaxResponse(); if (ids.Length > 0) { try { var models = await db.WeiChat_KeyWordTextContents.Where(p => ids.Contains(p.Id)).ToListAsync(); if (models.Count == 0) { ajaxResponse.Success = false; ajaxResponse.Message = "没有找到匹配的项,项已被删除或不存在!"; return Json(ajaxResponse); } switch (operation.ToUpper()) { case "DELETE": #region 删除 { db.WeiChat_KeyWordTextContents.RemoveRange(models); await db.SaveChangesAsync(); ajaxResponse.Success = true; ajaxResponse.Message = string.Format("已成功操作{0}项!", models.Count); break; } #endregion default: break; } } catch (Exception ex) { ajaxResponse.Success = false; ajaxResponse.Message = ex.Message; } } else { ajaxResponse.Success = false; ajaxResponse.Message = "请至少选择一项!"; } return Json(ajaxResponse); }
批量操作是很常见的一个场景,这里自动生成了批量删除的代码。当然,你也可以根据需要将此处修改为软删除。
然后视图这块,生成了批量操作的前端代码:
function batchOperation(operation, comfirmMessage) { var $checkInputs = $("input[type=checkbox][name=ids]:checked"); if ($checkInputs.length == 0) { mwc.message.warn("请至少选择一项!"); return; } function post() { var ids = new Array(); $.each($("input[type=checkbox][name=ids]:checked").serializeArray(), function (i, v) { ids.push(v.value); }); mwc.restApi.post({ url: "@Request.RequestContext.RouteData.GetRequiredString("controller")/BatchOperation/" + operation, contentType: "application/x-www-form-urlencoded", data: { ids: ids }, success: function (data) { location.reload(); } }); } if (comfirmMessage) { mwc.message.confirm("", comfirmMessage, function (isConfirmed) { isConfirmed && post(); }); } else { post(); } } $(function () { $('input[type=checkbox]').iCheck({ checkboxClass: 'icheckbox_square-green', radioClass: 'iradio_square-green', }); $("#chkCheckAll").on('ifToggled', function (e) { $("input[type=checkbox][name=ids]").iCheck(e.currentTarget.checked ? "check" : "uncheck"); }) //批量操作 $("#toolBar button[data-action],a[data-action]").on('click', function () { batchOperation($(this).data("action"), $(this).data("comfirmmessage")); }); });
对于新增、编辑视图,生成了日历控件的代码,不过可以按照个人需求选择注销。
同时,模板也支持多主键代码生成,例如前端复选框选择代码:
<input type="checkbox" name="ids" class="i-checks" value="@(item.BillID + " ;" + item.ItemNo)" />
操作代码:
<li>@Html.ActionLink("编辑", "Edit", new { id = item.BillID + ";" + item.ItemNo })</li> <li>@Html.ActionLink("删除", "Delete", new { id = item.BillID + ";" + item.ItemNo })</li>
然后,批量操作的方法参数也修改为string数组:
public async Task<ActionResult> BatchOperation(string operation, params string[] ids)
而获取批量操作的对象也根据多个主键进行了筛选:
var models = await db.B_RecommendDet.Where(p => ids.Contains(p.BillID + ";" + p.ItemNo)).ToListAsync();
同样的,增删等操作也进行了处理:
var ids = id.Split(';'); var id0 = int.Parse(ids[0]); var id1 = int.Parse(ids[1]); B_RecommendDet b_RecommendDet = await db.B_RecommendDet.FindAsync(id0, id1);
尾声
并不打算过多的介绍,那就到此为止吧。之所以没有沿用之前摸索出来的代码生成方式,主要是因为个人精力有限,暂时难以花费太多精力在代码生成这块。
好的架构是根据自身业务重构出来的,适合自己的架构就是好的。
在代码设计方面,本人现在更热衷于简单设计,轻架构,“简单”代码。
下载地址:点此下载(http://files.cnblogs.com/files/codelove/CodeTemplates.zip)
相关文章推荐
- Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码
- asp.net 后台cs代码怎么操作前台用ajax实现下拉框进行搜索
- asp.net控件的分页批量全选删除
- ASP.NET中Gridview读取数据表列表页面常用操作-序号,编辑,删除,删除确认
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(二)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,批量删除,写入)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- 在ASP.NET 2.0中操作数据之六十三:GridView实现批量删除数据
- Asp.Net_文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- ASP.NET 中 对GridView(网格视图)的查、分页、编辑更新、删除操作
- asp.net中GridView删除前的确认操作
- ASP.NET中Gridview读取数据表列表页面常用操作-序号,编辑,删除,删除确认
- asp.net gridview实现全选,反选与删除记录的操作代码
- 在ASP.NET 2.0中操作数据之二十二:为删除数据添加客户端确认
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(一)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,批量删除,写入)
- Asp.net(C#)对文件操作的方法(读取,删除,批量拷贝,删除...)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- [导入]Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(一)
- asp.net gridview实现全选,反选与删除记录的操作代码