构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单...

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单

系列目录

设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四步。

开始之前先说说表的结构。

其实表Flow_Form与Flow_FormContent设计是有一个缺陷的。我总共是设置最高26个字段从A~Z如果超过26个字段的表单是属于硬编码的。但是我认为26个字段已经足够

因为这里我是单表模式比起表关联无限字段理论上性能会更加快,特别是当数据库申请带到千万级数据的时候(你自己可以设计更加灵活的表单管理)

Flow_Form的A~Z对应的是Flow_FlowAttr表中的数据,

Flow_FormContent表中的数据就是用户对表单的申请内容。同样从A~Z对应。这个表设计也有缺陷,我把内容全部设置为varchar(2048)字段太大,可以根据自己的扩展来确定内容是最佳的方式,比如A-F是大字段,G-L设置的是中级长度的字段,M-O是数字的字段等等

准备开始

1.新建控制器FormController(用代码生成器即可)

新建视图Create.cshtml,这里我设计了一个手风琴,设计表单的同时设计字段

把代码生成器生成的Form表单的的Create代码放到

第一步:设计表单里面

第二步添加字段,添加字段是一个DropDownList+easyui-combogrid来组成。

 具体代码实现如下

@model App.Models.Flow.Flow_FormModel
@using App.Common;
@using App.Models.Flow;
@using App.Admin;
@using App.Models.Sys;
@{ViewBag.Title = "创建";Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";List<permModel> perm = (List<permModel>)ViewBag.Perm;if (perm == null){perm = new List<permModel>();}
}<script type="text/javascript">$(function () {jQuery("#accordion").accordion({ //初始化accordion
            fillSpace: true,fit: false,border: false,animate: false});$("#btnSave").click(function () {if ($("form").valid()) {$.ajax({url: "@Url.Action("Create")",type: "Post",data: $("form").serialize(),dataType: "json",success: function (data) {if (data.type == 1) {window.parent.frameReturnByMes(data.message);window.parent.frameReturnByReload(true);window.parent.frameReturnByClose()}else {window.parent.frameReturnByMes(data.message);}}});}return false;});$("#btnReturn").click(function () {window.parent.frameReturnByClose();});//改变字段列表
        $("#TypeName").change(function () {$('#attrVal').val("");$('#formAttrComboGrid').combogrid('setValue', '').combogrid('clear');$("#formAttrComboGrid").combogrid('grid').datagrid("load", { queryStr: $("#TypeName").val() });});});//添加一个字段到表单function AddAttr() {var currentValue= $('#attrVal').val();if (currentValue == "") {$.messageBox5s('提示', "请选择要添加的字段!");}var charNo = $("#AttrList tr").size()+1;//第几个字符if (charNo > 26){$.messageBox5s('提示', "目前设计最高26个字段!");return;}var b = false;$("#AttrList input[type='hidden']").each(function (i) {//判断是否有重复的项目if ($(this).val() == currentValue){b = true;return;}});if (b){$.messageBox5s('提示', "已经有重复的项目了!");return;}var grid = $("#formAttrComboGrid").combogrid("grid");//获取表格对象 var row = grid.datagrid('getSelected');//获取行数据 var currentChar = "Attr" + getChar(charNo);//获取当前的字母var example = getExample(row.AttrType);//添加到候选区
        $("#AttrList").append("<tr id='tr" + currentChar + "'><td style='text-align:right'>" + row.Title + ":</td>" +"<td>" + example + "<input id='" + currentChar + "' name='" + currentChar + "' type='hidden' value='" + currentValue + "' /></td><td><a href=\"javascript:deleteCurrentTR('tr" + currentChar + "');\">[删除]</a></td></tr>");//设置combogrid为空
        $('#formAttrComboGrid').combogrid('setValue', '');}function deleteCurrentTR(c){ $.messager.confirm('提示', '删除字段吗?', function (r) {if (r) {$("#" + c).remove();}});}function getExample(v){switch (v){case "文本": return "<input type='text' />";case "多行文本": return "<textarea></textarea>";case "数字": return "<input type='text' />"; case "日期": return "<input type='text' />";}}function getChar(i){switch (i){case 1: return "A"; break;case 2: return "B"; break;case 3: return "C"; break;case 4: return "D"; break;case 5: return "E"; break;case 6: return "F"; break;case 7: return "G"; break;case 8: return "H"; break;case 9: return "I"; break;case 10: return "J"; break;case 11: return "K"; break;case 12: return "L"; break;case 13: return "M"; break;case 14: return "N"; break;case 15: return "O"; break;case 16: return "P"; break;case 17: return "Q"; break;case 18: return "R"; break;case 19: return "S"; break;case 20: return "T"; break;case 21: return "U"; break;case 22: return "V"; break;case 23: return "W"; break;case 24: return "S"; break;case 25: return "Y"; break;case 26: return "Z"; break;default: break;}}</script>
<div class="mvctool bgb">@Html.ToolButton("btnSave", "icon-save", "保存", perm, "Save", true)@Html.ToolButton("btnReturn", "icon-return", "返回", false)
</div>@using (Html.BeginForm())
{<div id="accordion" class="easyui-accordion"><div title="第一步:设计表单" style="overflow: auto; padding: 10px;">@Html.HiddenFor(model => model.Id)<table class="fromEditTable setTextWidth300"><tbody><tr><td style="width: 100px; text-align: right;">@Html.LabelFor(model => model.Name):</td><td style="width: 310px">@Html.EditorFor(model => model.Name)</td><td>@Html.ValidationMessageFor(model => model.Name)</td></tr><tr><td style="width: 100px; text-align: right;">@Html.LabelFor(model => model.Remark):</td><td style="width: 310px">@Html.TextAreaFor(model => model.Remark, 5, 80, new { })</td><td>@Html.ValidationMessageFor(model => model.Remark)</td></tr><tr><td style="width: 100px; text-align: right;">@Html.LabelFor(model => model.UsingDep):</td><td style="width: 310px">@Html.EditorFor(model => model.UsingDep)</td><td>@Html.ValidationMessageFor(model => model.UsingDep)</td></tr><tr><td style="width: 100px; text-align: right;">@Html.LabelFor(model => model.TypeId):</td><td style="width: 310px">@Html.DropDownListFor(model => model.TypeId, ViewBag.FlowType as SelectList)</td><td>@Html.ValidationMessageFor(model => model.TypeId)</td></tr><tr><td style="width: 100px; text-align: right;">@Html.LabelFor(model => model.State):</td><td style="width: 310px">@Html.CheckBoxFor(model => model.State, new { @checked = true })</td><td>@Html.ValidationMessageFor(model => model.State)</td></tr><tr><td><div style="float: right" class="pic_204"></div></td><td colspan="2" class="gray">注:设计好表单和字段才能组成一个完整的表单,设计好表单后才能设计步骤</td></tr></tbody></table></div><div title="第二步:添加字段" style="overflow: auto;"><table class="fromEditTable setTextWidth300 bgb"><tr><td style="width:40px; text-align: right;">类别:</td><td style="width: 110px;">@Html.DropDownListFor(model => model.TypeName, ViewBag.FlowType as SelectList, new { @style = "width:100px;" })</td><td style="width:40px; text-align: right;">字段:</td><td style="width: 210px"><input id="attrVal" name="attrVal" type="hidden" /><select class="easyui-combogrid" style="width:200px" id="formAttrComboGrid" data-options="panelWidth: 470,idField: 'Id',textField: 'Title',rownumbers: true,//行号url: '@Url.Action("GetFormAttrList")?page=1&sort=Id&rows=1000&order=desc',page:1,columns: [[{ field: 'Id', title: 'ID', width: 80, hidden: true },{ field: 'Title', title: '字段标题', width: 80, sortable: true },{ field: 'Name', title: '英文名称', width: 80, sortable: true },{ field: 'AttrType', title: '类型', width: 80, sortable: true },{ field: 'CheckJS', title: '校验脚本', width:50, sortable: true },{field: 'CreateTime', title: '创建时间', width: 80, sortable: true }]], onClickRow: function (index, data) {var value =  $('#formAttrComboGrid').combogrid('getValue');$('#attrVal').val(value);},onLoadSuccess:function (data) {},fitColumns: true"></select></td><td><a href="javascript:AddAttr();" class="easyui-linkbutton" data-options="iconCls:'icon-add'">添加</a></td></tr></table><table id="AttrList" class="fromEditTable setTextWidth300"></table></div></div>
}
Create.cshtml

FormController核心代码

 [HttpPost]public JsonResult GetFormAttrList(GridPager pager, string queryStr){List<Flow_FormAttrModel> list = attrBLL.GetList(ref pager, queryStr);var json = new{total = pager.totalRows,rows = (from r in listselect new Flow_FormAttrModel(){Id = r.Id,Title = r.Title,Name = r.Name,AttrType = r.AttrType,CheckJS = r.CheckJS,TypeId = r.TypeId,CreateTime = r.CreateTime}).ToArray()};return Json(json);}
获取字段列表

代码分析:

主要难点在切换类表需要重新加载combogrid,然后根据选择的字段组成表单。

利用前端技术控制,进行字段类表的筛选获得字段。再添加字段的ID到隐藏的DIV,最后序列化整张表单保存。

整个工作流中,前端的技术代码量远超后台代码。所以关注点都在前端代码中

posted on 2015-05-04 15:06 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4476238.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言中变量的声明

参考链接为&#xff1a;http://zhidao.baidu.com/link?urlQZiRv_6nAzF1XHOG83SwngS1HoRZXWSP2a0uQEHVDON1rP1a07xlXCiYUXd0ORQP32h_7Nhfd-afCMox8q8McKDATAS SEGMENT;定义数据段BUF0 DB 1;定义一个字节型变量&#xff0c;名称是BUF0&#xff0c;初始值是01HBUF1 DB "2&qu…

php标签嵌入规范,HTML标签嵌套的详细规则

这次给大家带来HTML标签嵌套的详细规则&#xff0c;HTML标签嵌套的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。最近在重新学习HTML的知识&#xff0c;算是对HTML的一个重新认识吧&#xff01;别小看了这东西&#xff0c;一切的网页可都是以它为基础…

6、动态方法调用和使用通配符定义

action名称后面:!方法名即可;使用通配符:12345678910111213<?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds…

Sql 函数大全 (更新中...由难到简

1.字符处理类&#xff1a; 1.1 指定指定字符输出的次数 select replicate(1a,5) 结果&#xff1a;1a1a1a1a1a &#xff08;5个1a&#xff09;转载于:https://www.cnblogs.com/shengwei/p/4479662.html

C错误处理

本文为个人学习笔记&#xff0c;仅用于个人学习、复习使用&#xff01;c语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值得形式允许您访问底层数据&#xff0c;在发生错误时&#xff0c;大多数的c或Unix函数调用返回1或NULL&#x…

存储过程——存储过程与视图(三)

数据库视图&#xff1a;视图是虚表&#xff0c;是从一个或几个基本表&#xff08;或视图&#xff09;中导出的表&#xff0c;在系统的数据字典中仅存放了视图的定义&#xff0c;不存放视图对应的数据。 在sql中视图是基于sql语句的结果集的可视化的表&#xff1b;视图包含行和列…

php如何转类型,PHP数据类型转换

指的是将数据(变量)的值转换成目标数据类型。PHP中有两种数据类型转换方式&#xff1a;自动转换&#xff0c;强制转换自动转换&#xff1a;系统根据操作所需要的类型将变量的值进行对应类型的转换自动转换都是系统本身所做的事情&#xff0c;不需要用户去干预。强制转换&#x…

lr_start_timer,lr_get_transaction_duration,lr_get_transaction_wasted_time函数使用总结

lr_start_timer&#xff1a; 函数的功能&#xff1a; 为了计算时间更加精确&#xff0c;可以用这个函数去掉LR自身的检查点所浪费的时间。如text check and image time Action() { double time_elapsed; merc_timer_handle_t timer;web_url("487989.html","URLh…

c可变参数

本文为个人学习笔记&#xff0c;仅供个人学习、复习使用。参考链接&#xff1a;链接1、链接2在c语言中&#xff0c;我们可以定义这样的函数&#xff0c;函数带有可变数量的参数。 int func(int num,...){ . . . } int main(){func(2,2,3); }1、要注意定义函数时函数的形式&…

dz打不开plugin. php,Discuz!应用中心打不开空白的解决方法

近期&#xff0c;很多使用Discuz!程序建论坛的站长都会发现&#xff0c;Discuz!后台的应用中心打不开了。这二天Discuz!终于给出了原因&#xff1a;十分抱歉的通知您&#xff0c;由于资源和人力投入问题&#xff0c;我们已经关闭了 www.discuz.net 的发言权限&#xff0c;但是历…

编程习题05

1、给定一个数组a[N],我们希望构造数组b[N]&#xff0c;其中b[i]a[0]*a[1]*...*a[N-1]/a[i]。在构造过程&#xff1a;不允许使用除法&#xff1b;要求O(1)空间复杂度和O(n)时间复杂度&#xff1b;除遍历计数器与a[N] b[N]外&#xff0c;不可使用新的变量(包括栈临时变量、对空间…

ECshop安装及报错解决方案总结

一、安装ECshop ECShop是一款B2C独立网店系统 &#xff0c;适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。2006年3月推出以来1.0版以来&#xff0c;受到市场的检验&#xff0c;广受好评。 1.安装准备 ECshop最新版本为2.7.3…

Command mysql 中文,MySQL Command Line[mysql命令行常用命令]_MySQL

bitsCN.comMySql下载地址&#xff1a;www.mysql.org第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysqlmysql -u用户名-p用户密码mysql -uroot -p&#xff0c; 回车後提示你输入密码&#xff0c;输入12345&#xff0c;然後回车即可进入到mysql中了&…

setTimeout里如果有$(this),$(this)指的是谁?

$(".next").click(function(){ setTimeout(function(){$(this).addClass("gray");//指向的是window 而不是$(".next") },1000); })转载于:https://www.cnblogs.com/xchlsl/p/4484762.html

数据结构--数组实现线性表

线性表&#xff1a;由同类型数据元素构成的有序序列的线性结构 编译环境&#xff1a;Dev-C 结构实现&#xff1a; struct LNode {ElementType Data[MAXSIZE];int last; }; 主要操作函数&#xff1a; List MakeEmpty();//初始化一个空表ElementType FindKth(int k, List L);//根…

Codeforces Round #241 (Div. 2) A. Guess a number!

题目链接 题意 &#xff1a; 就是猜数游戏&#xff0c;根据给定的操作&#xff0c;让你输出一个符合条件的。 思路 &#xff1a; 这个题好玩儿&#xff0c;设置两个变量&#xff0c;一个找符合条件的数的上限&#xff0c;一个找下限&#xff0c;再判断一下。 1 #include <st…

php中嵌套调用的原理,嵌套调用

## 嵌套调用- 模块与模块之间的相互调用(相对路径)- 项目和项目之间的相互调用(绝对路径)- 也可以写一个通用模块就可以大面积使用&#xff0c;减少代码维护成本- 或许可以实现一些神奇的效果#### 示例代码设置文件/html/www/demo/tpl/tpl.blade.php内容如下~~~这是最顶端模块{…

SET-UID程序漏洞实验

20125102 一、实验描述 Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候&#xff0c;它被假设为具有拥有者的权限。例如&#xff0c;如果程序的拥有者是root&#xff0c;那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有…

统计文件中有多少个单词amp;c语言实现

假设文件中的单词都是字母的组合&#xff0c;且单词间用空格或者“."区分。实验环境&#xff1a;Dev-C#include<stdio.h> #include<stdlib.h>int main(){FILE *fp;int i;int fr;long fsize;int word0;int sum0;char filename[20];char *buffer;printf("要…

oracle mul,汇编语言乘指令 MUL、IMUL的具体使用

MUL: 无符号乘;影响 OF、CF 标志位;指令格式:;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX当乘积的高半部分(AH、DX、EDX、RDX)中存有结…