構建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.pswp.cn/news/376015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376015.shtml
英文地址,請注明出處:http://en.pswp.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)中存有結…