博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码...
阅读量:7027 次
发布时间:2019-06-28

本文共 6080 字,大约阅读时间需要 20 分钟。

关于T4代码生成这块,我之前写过几篇帖子,如:《》()、《》()。ASP.NET Scaffolding虽然有些不足,但是思虑再三,考虑到时间成本,Magicodes.WeiChat中还是采用了ASP.NET Scaffolding模板来生成业务代码。目前已经实现了创建、删除、查看、编辑、分页、搜索、删除确认、批量操作、批量删除、支持日期控件、支持多个主键等情形的代码生成。

我们先来看看效果图:

效果图

代码基架的定制与修改

关于ASP.NET代码基架的知识与操作,请(),这里就不多说了。

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

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

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

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

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

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

代码生成

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

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

添加控制器

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

生成的代码

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

// GET: WeiChat_KeyWordTextContent        public async Task
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
( 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}        ///         /// 批量操作        ///         /// 操作方法        /// 主键集合        /// 
[HttpPost] [Route("WeiChat_KeyWordTextContent/BatchOperation/{operation}")] public async Task
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"));            });        });

对于新增、编辑视图,生成了日历控件的代码,不过可以按照个人需求选择注销。

同时,模板也支持多主键代码生成,例如前端复选框选择代码:

操作代码:

  • @Html.ActionLink("编辑", "Edit", new { id = item.BillID + ";" + item.ItemNo })
  • @Html.ActionLink("删除", "Delete", new { id = item.BillID + ";" + item.ItemNo })
  • 然后,批量操作的方法参数也修改为string数组:

    public async Task
    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://firxl.baihongyu.com/

    你可能感兴趣的文章
    centos7.4 开启ftp服务
    查看>>
    Groovy - Groovy Templates
    查看>>
    [Effective C# 4.0 译]第三章 用C#表达你的设计
    查看>>
    Auto-generate LotusScript setter and getter properties for class variables
    查看>>
    HDOJ---1074 Doing Homework[DP+状态压缩]
    查看>>
    读书笔记《集体智慧编程》Chapter 4 : Searching and Ranking
    查看>>
    jquery form 插件 分类: JavaScript ...
    查看>>
    php二维数组访问
    查看>>
    Hibernate + MySQL中文乱码问题
    查看>>
    ios中键盘处理(二)
    查看>>
    浏览器对象
    查看>>
    cookie——小甜品
    查看>>
    Windows调试的基石——符号(1)
    查看>>
    【dynamic】简化反射简单尝试
    查看>>
    centos下node.js的安装
    查看>>
    C# WEB API ApiController 修改response header contentType
    查看>>
    Android 测试入门之---Monkey test
    查看>>
    Lemon OA第3篇:核心功能
    查看>>
    ReportMachine 打印机横向
    查看>>
    asterisk manager api 配置 (manager.conf)
    查看>>