基于FineUIMVC的代码生成器(传统三层)v1.0-2

简介: 第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自带的模板并不适合所有开发环境,所以还是侧重模板编写和接口。

第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自带的模板并不适合所有开发环境,所以还是侧重模板编写和接口。

前面说到我要写个MVC前台的模板按表生成 Index.cshtml 和 Controller.cs,所以就那这两个做个例子。说到模板就是一个制式的文件,我要先做错一个标准文件作为模板,然后根据不同表生成自己的文件, 其实大家都是程序员说这都是废话,博客比较长,说明的比较细,截图多,最下面有源码
环境准备,我先搭了一个FineUI的空项目 CodeFDemo
用生成工具生成了 asset_a2 表的后台三层
 
添加到项目,生成,该表是一个资产分类表
 

第一步 做一个模板的真实页面

准备工作做完,再做一个前台展示页面,以此为标准制作模板文件
Index.cshtml
 
@{
    ViewBag.Title = "Index";
    var F = Html.F();
}
@section head {

}
@section body {
    @(
         F.Panel()
         .IsViewPort(true)
         .ShowBorder(false)
         .ShowHeader(false)
         .Layout(LayoutType.Region)
         .Items(
             //中间Panel 查询和列表
             F.Panel()
             //.IsViewPort(true)
             .BoxFlex(4)
             .Layout(LayoutType.VBox)
             .BodyPadding(0)//5
             .BoxConfigChildMargin("0 0 0 0")//0 0 5 0
             .ShowBorder(false)
             .ShowHeader(false)
             .Items(
                 //查询表单
                 F.Form()
                 .ID("searchForm").Title("查询条件")
                 .BodyPadding(5).BoxConfigChildMargin("0 5 0 5").BoxFlex(1)
                 .Layout(LayoutType.VBox)
                 .BoxConfigAlign(BoxLayoutAlign.Stretch).BoxConfigPosition(BoxLayoutPosition.Center)
                 .EnableCollapse(true)
                 .LabelWidth(100)
                 .RowsEx(4,
                     F.TextBox()
                         .ID("txtstr20")
                         .Attribute("data", "SYS_ASSET_A1_160")
                         .Label("分类名称")
                         .EmptyText("分类名称"),
                     F.TextBox()
                         .ID("txtstr20")
                         .Attribute("data", "SYS_ASSET_A1_160")
                         .Label("分类编号")
                         .EmptyText("分类编号")
                 )
                 ,
                 //列表
                 F.Grid()
                 .Title("列表")
                 .ID("Grid1")
                 .BoxFlex(6)
                 .EnableCheckBoxSelect(true)
                 .DataIDField("ASSET_A2_AUTOID")
                 .AllowPaging(true)
                 .EnableHeaderMenu(false)
                 .PageSize(15)
                 .Toolbars(
                     F.Toolbar().Items(
                             F.DefaultGridBtn("Grid1")
                         )
                     )
                 .Columns(
                         F.RowNumberField(),
                         F.RenderField()
                             .HeaderText("ID")
                             .Hidden(true)
                             .DataField("ASSET_A2_AUTOID"),
                         F.RenderField()
                             .HeaderText("分类名称")
                             .ExpandUnusedSpace(true)
                             .DataField("ASSET_A2_10"),
                         F.RenderField()
                             .HeaderText("分类编号")
                             .ExpandUnusedSpace(true)
                             .DataField("ASSET_A2_20"),
                         F.RenderField()
                             .HeaderText("新增时间")
                             .ExpandUnusedSpace(true)
                             .DataField("ASSET_A2_MAKETIME")

                         )
                 .DataSource(ViewBag.griddata)
                 //.Listener("rowclick", "OnGrid1RowClick")
                 )
             )
    )
}
@section script {
<script>
        F.ready(function () {
        })

        //列表行点击事件
        function OnGrid1RowClick(e, rowid) {
            F.doPostBack('@Url.Action("Grid1_RowClick")', {
                rowid: rowid,
                fields: F.ui.Grid1.fields
            });
        }

        //列表新增
        function Grid1new_Click() {
            F.ui.Grid1.showEdit();//新增
        }
        //列表修改 得到列表选中项 getSelectedRows 注意DataIDField属性
        function Grid1edit_Click(g,rowid) {
            F.ui.Grid1.showEdit(true);//修改
        }
        //删除 删除此方法自动回发Grid1Del_Click 方法 参数为 id fields
        function Grid1delete_Click(g,ids) {

        }
        //刷新列表
        function lodeGrid() {
            F.doPostBack('@Url.Action("lodeGrid")', {
                fields: F.ui.Grid1.fields
            });
        }

</script>

}

asset_a2Controller.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CodeFDemo.BP;

namespace CodeFDemo.Controllers.sysApp
{
    public class asset_a2Controller : Controller
    {
        // GET: sysA1
        public ActionResult Index()
        {
            BLLasset_a2 bll = new BLLasset_a2();
            ViewBag.griddata = bll.Getasset_a2MsByQuery(new Message.MsQuery()).ToArray();
            return View();
        }
    }
}

 OK,浏览下(本实例只做列表展示)

 

第二步 将标准文件改写为模板文件

再看下代码,其中Grid的Columns是列的循环,查询条件也是列的循环,数据库表格的列一循环就可以了
所以就有了两个模板
@{
    ViewBag.Title = "Index";
    var F = Html.F();
}
@section head {

}
@section body {
    @(
         F.Panel()
         .IsViewPort(true)
         .ShowBorder(false)
         .ShowHeader(false)
         .Layout(LayoutType.Region)
         .Items(
             //中间Panel 查询和列表
             F.Panel()
             //.IsViewPort(true)
             .BoxFlex(4)
             .Layout(LayoutType.VBox)
             .BodyPadding(0)//5
             .BoxConfigChildMargin("0 0 0 0")//0 0 5 0
             .ShowBorder(false)
             .ShowHeader(false)
             .Items(
                 //查询表单
                 F.Form()
                 .ID("searchForm").Title("查询条件")
                 .BodyPadding(5).BoxConfigChildMargin("0 5 0 5").BoxFlex(1)
                 .Layout(LayoutType.VBox)
                 .BoxConfigAlign(BoxLayoutAlign.Stretch).BoxConfigPosition(BoxLayoutPosition.Center)
                 .EnableCollapse(true)
                 .LabelWidth(100)
                 .RowsEx(4
                     $$TextBoxForSearch$$
                 )
                 ,
                 //列表
                 F.Grid()
                 .Title("列表")
                 .ID("Grid1")
                 .BoxFlex(6)
                 .EnableCheckBoxSelect(true)
                 .DataIDField("$$KEY$$")
                 .AllowPaging(true)
                 .EnableHeaderMenu(false)
                 .PageSize(15)
                 .Toolbars(
                     F.Toolbar().Items(
                             F.DefaultGridBtn("Grid1")
                         )
                     )
                 .Columns(
                         F.RowNumberField(),
                         F.RenderField()
                             .HeaderText("ID")
                             .Hidden(true)
                             .DataField("$$KEY$$")
                         $$GridColumns$$

                         )
                 .DataSource(ViewBag.griddata)
                 //.Listener("rowclick", "OnGrid1RowClick")
                 )
             )
    )
}
@section script {
<script>
        F.ready(function () {
        })

        //列表行点击事件
        function OnGrid1RowClick(e, rowid) {
            F.doPostBack('@Url.Action("Grid1_RowClick")', {
                rowid: rowid,
                fields: F.ui.Grid1.fields
            });
        }

        //列表新增
        function Grid1new_Click() {
            F.ui.Grid1.showEdit();//新增
        }
        //列表修改 得到列表选中项 getSelectedRows 注意DataIDField属性
        function Grid1edit_Click(g,rowid) {
            F.ui.Grid1.showEdit(true);//修改
        }
        //删除 删除此方法自动回发Grid1Del_Click 方法 参数为 id fields
        function Grid1delete_Click(g,ids) {

        }
        //刷新列表
        function lodeGrid() {
            F.doPostBack('@Url.Action("lodeGrid")', {
                fields: F.ui.Grid1.fields
            });
        }

</script>

}
                    ,F.TextBox()
                         .ID("txt$$ColunName$$")
                         .Attribute("data", "$$ColunName$$")
                         .Label("$$ColunNotes$$")
                         .EmptyText("$$ColunNotes$$")

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using $$namespace$$.BP;

namespace $$namespace$$.Controllers.sysApp
{
    public class $$tablename$$Controller : Controller
    {
        // GET: sysA1
        public ActionResult Index()
        {
            BLL$$tablename$$ bll = new BLL$$tablename$$();
            ViewBag.griddata = bll.Get$$tablename$$MsByQuery(new Message.MsQuery()).ToArray();
            return View();
        }
    }
}

 

其中$$namespace$$ $$tablename$$ $$KEY$$ $$ColunName$$ $$ColunNotes$$ 都是系统默认字典。
 
多了两个自定义字典$$TextBoxForSearch$$和$$GridColumns$$,其中$$TextBoxForSearch$$单独建了一个模板,为了让大家看看接口实现的另一种写法。
将保存好的模板放到模板目录里
 

第三步 编写模板翻译类

新建模板扩展类,引用CodeFactoryMVC.Main.dll,列实现接口ICodeFactory

注意第43行:

生成CodeFEx.dll,考到bin文件夹下,在web上新增接口

 OK完成,刷新页面选择其余表,填写项目名称,点击生成,拷贝到原项目,随便找个表预览下

 

 

 

一个list页面就做好了。CodeFDemo的项目源码会放在 知识星球 提供下载,

没有加入星球的赶紧加入(越来越贵!)

 

 

 
 
 
 
 
 
目录
相关文章
|
移动开发 Java 数据安全/隐私保护
C#RSA加密解密签名类,支持PEM格式解密(1024或2048位)
主要介绍了PEM PKCS#8、PKCS#1公钥和私钥在C#中的使用,并以此为基础写的C#函数方法。
3678 1
|
运维 Kubernetes 监控
什么是Kubeasz
Kubeasz(Kubernetes Easy Setup with Ansible)是一个开源项目,旨在简化Kubernetes集群的部署过程。它使用Ansible作为基础设施管理工具,通过预定义的剧本和配置模板,自动化整个K8s集群的搭建流程。以下是对Kubeasz的详细介绍: ### 一、Kubeasz的特点 1. **快速部署**:Kubeasz支持一键部署Kubernetes集群,大大节省了运维成本和时间。 2. **高可用性**:可以部署高可用的Kubernetes集群,确保系统的稳定性和可靠性。 3. **可扩展性**:支持容器化部署,可以方便地扩展集群规模,满足不同的业务需
1262 3
|
10月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
266 18
|
存储 前端开发
【大前端】用html和css写一个QQ邮箱登录页面
【大前端】用html和css写一个QQ邮箱登录页面
1125 0
【大前端】用html和css写一个QQ邮箱登录页面
|
前端开发 JavaScript 程序员
JQ-bootstrap我的开源前端框架
因为实在不知道写啥,所以迟迟没有相关的介绍。但是必须要积累过程资产,所以还是介绍一下,不定哪天就有人用了。       首先还是介绍遇到的问题,我是做传统后台管理系统的,公司赶时髦,要用bootstrap。
1768 0
|
前端开发
ASP.NET-FineUI开发实践-18
Grid编辑下垃级联 看了看专业版的例子,分为以下几步,都是前端的 1.编辑父下拉框后,重置子下拉框 2.编辑子下垃框前,通过父下垃框数据得到下垃项,然后绑定数据 所以这里要截取Grid的两个事件,编辑前事件和编辑后事件 我以前博客里有编辑前事件 即beforeedit 编辑后事件为 edi...
992 0
|
Java C# 数据安全/隐私保护
C# Java间进行RSA加密解密交互
原文: C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了。
1352 0
|
JavaScript
ASP.NET-FineUI开发实践-17
我又不用FineUI开发,所以FineUI项目经验等于0,最近在忙别的,所以也没工夫研究。积累了论坛和群里的问题,写下来留个备份 1.在grid可编辑单元格中,如果需要在点击该单元格时,单元格中所有文字内容全部选中的功能如何实现 引用地址 http://fineui.
1161 0
|
JavaScript .NET
FineUI开源版(ASP.Net)初学手册-部分JS整理
   有人老找JS,我吧FineUI自己写的JS沾过来方便大家看看,在实现前端的时候更灵活     JS 实例 注释 控件 F.
2055 0