Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码

关于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模板来生成业务代码。目前已经实现了创建、删除、查看、编辑、分页、搜索、删除确认、批量操作、批量删除、支持日期控件、支持多个主键等情形的代码生成。

我们先来看看效果图:

效果图

代码基架的定制与修改

关于ASP.NET代码基架的知识与操作,请阅读此处http://www.cnblogs.com/codelove/p/4251533.html),这里就不多说了。

虽然ASP.NET Scaffolding Template存在一些缺陷,无法完美的实现某些代码生成的问题,但是我们目前不需要到这个级别,因此还是勉强够用了。

如下图所示,我们修改了基架模板,目录位置如下:

其中,我们需要重点关注以下两个目录:

MvcControllerWithContext:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成控制器代码的T4模板。

MvcView:该目录下的模板为添加控制器时,选择基架项为【包含视图的 MVC5 控制器(使用Entity Framework)】时生成增删改查视图的代码的T4模板。

然后,我们就开始生成之旅。

代码生成

添加控制器,选择代码基架

这里选择【包含视图的MVC5控制器(使用 Entity Framework)】。

添加控制器

个人比较喜欢使用异步控制器操作。

生成的代码

我们先来看看生成的列表代码:

// 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

时间: 2024-10-22 03:31:10

Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码的相关文章

2.非关系型数据库(Nosql)之mongodb:mongodb显示所有数据库,使用数据库,集合创建(显示和隐式创建),集合查询,初步数据的增删改查,分页

 1代开一个cmd窗口,当作mongodb客户端,执行以下命令: mongo localhost:27017 2查看所有的数据库: > show dbs; admin (empty) local 0.078GB 3 db命令,查看当前窗口在那个数据库下面(test数据库没有任何数据,在内存里面): 4创建集合 A 显示创建 db.createCollection("collectionName"); > db.createCollection("c1"

【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】

  简单的需求,点点鼠标就可以了,那么复杂的需求呢?还是要写代码,哈哈. 不要被我误导了哦,关于什么时候写代码的问题,请看这里:http://www.cnblogs.com/jyk/archive/2009/06/21/1507594.html    单表的增删改查         我有一个梦想,那就是不用敲代码,只需要点点鼠标,就可以实现客户的需求.       可能您会说这是不可能的,但是有个梦想总没有错吧.我就是想实现我的这个梦想,虽然可能一辈子都达不到,但是我还想努力一下子,不想让自己后

springboot(十五):springboot+jpa+thymeleaf增删改查示例

这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上手最好.在网上找相关资料的时候总是很麻烦,有的文章写的挺不错的但是没有源代码,有的有源代码但是文章介绍又不是很清楚,所在找资料的时候稍微有点费劲.因此在我学习Spring Boot的时候,会写一些最简单基本的示例项目,一方面方便其它朋友以最快的方式去了解,一方面如果我的项目需要用到相关技术的时候,直

java-spring 多表增删改查 多次操作不刷新

问题描述 spring 多表增删改查 多次操作不刷新 不知道是jsp页面代码的问题 还是控制器写的有问题 增加连续写到第3个吗四个服务器就不动了 也不报错 主要的控制器部分代码如下 ?@RequestMapping(value = "/addRiddle") public String addRiddle (Riddle riddle, HttpServletRequest request) { riddleServ.save(riddle); return this.getAllRi

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码 上一讲我们创建了一系列的解决方案,我们通过一个例子来看看层与层之间的关系. 我们把Controllers分离出来了BLL层和DAL层 BLL专注于业务上的处理 DAL专注于数据访问层的处理 而Controller跟清楚的与View交互 我们上一讲已经在EF添加了一个实体SysSample 下面我们创建IDAL,DAL,IBLL,BLL的代码吧 using App.Mod

asp.net操作xml增删改示例分享

 这篇文章主要介绍了asp.net操作xml增删改示例,需要的朋友可以参考下   代码如下: using System;  using System.Collections;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Web;  using System.Web.SessionState;  using System.Web.UI;  using System.We

asp net 管理系统-求一个简单的asp的web页面管理系统,只要求实现增删改查就行

问题描述 求一个简单的asp的web页面管理系统,只要求实现增删改查就行 求大神发一个初学者的管理给我,顺带讲解讲解,实在做不出来....................qq:732796124

hibernate-Hibernate可以自动生成实体类的增删改查的方法吗?

问题描述 Hibernate可以自动生成实体类的增删改查的方法吗? Hibernate可以自动生成实体类的增删改查的方法吗? Hibernate可以自动生成实体类的增删改查的方法吗? 解决方案 可以,MyEclipse的反向工程有这个功能 解决方案二: Hibernate自动生成实体类 解决方案三: 可以的. 在Myeclipse中,正逆向工程操作比较简单,而如果是eclipse的话,会比较麻烦,因为必须要先配置下Hibernate环境(同理如果要生成其他持久化层框架的实体类,也需要先配置).

asp.net mvc4 如何向mysql 中实现 增删改查操作

问题描述 asp.net mvc4 如何向mysql 中实现 增删改查操作 如题,最近在写一个基于asp.net mvc4网站,后台要求使用mysql数据库,现在的情况是数据库可以连通,单独的sql也会写,但是我不知道按照规范应该在哪写,以及如何通过方法写对应实体的增删改查这些个基本操作,还望有经验的高手能够指点一二! 解决方案 mysql也有entity provider,如果你用它,那么编程和使用sql server没有什么不同. 解决方案二: http://ju.outofmemory.c