新聞中心
一、前言

創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元上黨做網(wǎng)站,已為上家服務(wù),為上黨各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
作為一個(gè)碼農(nóng)這么多年,一直在想怎么提高我們的編碼效率,關(guān)于如何提高編碼效率,我自己的幾點(diǎn)體會(huì)
1、清晰的項(xiàng)目結(jié)構(gòu),要編寫代碼的地方集中
2、實(shí)現(xiàn)相同功能的代碼量少并且清晰易懂
3、重復(fù)或有規(guī)律的代碼應(yīng)該自動(dòng)生成
在這里我就討論下代碼生成的問(wèn)題。
二、關(guān)于代碼生成器
剛畢業(yè)時(shí)我也非常迷信代碼生成器,喜歡在網(wǎng)上找一些代碼生成器及相關(guān)的源碼,喜歡在和網(wǎng)友討論哪款生成器***用,但實(shí)際上很少真正用這些東西來(lái)開(kāi)發(fā)項(xiàng)目,原因很簡(jiǎn)單:
1、生成出來(lái)的代碼不是我們要的代碼
2、生成后的代碼再修修改改,其實(shí)還沒(méi)有我的ctrl+c和ctrl+v速度快。
3、生成的基本上是實(shí)體類及sql拼接代碼,現(xiàn)在直接用linq或一些好用的orm多方便,誰(shuí)還用SQLHelper加sql文拼接?
4、b/s項(xiàng)目中沒(méi)有一個(gè)生成器能很好的能生成UI層代碼及前端交互的js代碼,即使能生成也是簡(jiǎn)單的頁(yè)面。
所以,我勸大家不要迷信代碼生成器了。它的確可以提高我們的效率,但是并不是網(wǎng)上你找一個(gè)生成器就行的。代碼生成器它只是一個(gè)模板引擎而已,最重要的不是代碼生成器本身,而是對(duì)一類功能或一類頁(yè)面的代碼規(guī)范,對(duì)自己代碼的提煉,提煉出一個(gè)通用的模板。
比如我們常見(jiàn)的查詢頁(yè)面,錄入頁(yè)面等,我們只要提煉一個(gè)標(biāo)準(zhǔn)的查詢頁(yè)面的代碼,包括前臺(tái)html,前臺(tái)js,后臺(tái)控制器,后臺(tái)數(shù)據(jù)服務(wù)。然后把它寫成模板,再利用模板引擎就可以生成我們需要的代碼了。
代碼生成器本身就是模板引擎,所以我覺(jué)得***的代碼生成器不是網(wǎng)上流傳的那些可以生成三層架構(gòu)代碼的軟件,而是微軟的razor引擎,非常簡(jiǎn)潔易懂,而且做過(guò)asp.net mvc項(xiàng)目的朋友應(yīng)該也很熟悉。我個(gè)人覺(jué)得這是用來(lái)做代碼生成***的引擎。
三、頁(yè)面模板
我們還是會(huì)想要快速開(kāi)發(fā),比如我選擇了一些設(shè)定之后,就可以直接生成我想要的代碼包括html及js,拷貝到項(xiàng)目中就可以直接運(yùn)行,運(yùn)行后就看到我想要的頁(yè)面,基本功能都有。當(dāng)然這里所說(shuō)的快速開(kāi)發(fā)是建立在我對(duì)頁(yè)面功能的提煉模板之上的。實(shí)際上我提煉了三種模板:
1、查詢頁(yè)面
這個(gè)模板可以解決大部分的查詢報(bào)表業(yè)務(wù)功能
2、編輯頁(yè)面
這個(gè)編輯模板可以解決基本上所有的錄入功能,因?yàn)榘酥鞅?,及多個(gè)從表(1:N或1:1)錄入,而且可以一次性在同一事務(wù)中保存。并且定義了很多觸發(fā)前后事件用于寫一些業(yè)務(wù)處理,并且做到差異更新。
3、查詢編輯頁(yè)面,可以查詢也可以直接在grid中編輯,這個(gè)頁(yè)面用于做一些簡(jiǎn)單單據(jù)或一些基礎(chǔ)數(shù)據(jù)頁(yè)面。
四、代碼生成原理
把以上頁(yè)面代碼做成razor模板,razor模板 + 設(shè)定選項(xiàng) ==razor引擎==> 頁(yè)面代碼
怎么利用razor引擎,其實(shí)有以下幾種方法:
1、直接利用mvc的view輸出功能,以下為關(guān)鍵代碼
- var stringWriter = new StringWriter();
- var viewContext = new ViewContext(controllerContext, view, viewData, TempData, stringWriter);
- view.Render(viewContext, stringWriter);
- var result = stringWriter.ToString();
用這種方法的優(yōu)點(diǎn)在于不需要引入第三方類庫(kù),直接調(diào)用mvc視圖的Render方法生成,而且效率很高,缺點(diǎn)是controllerContext及view對(duì)象的構(gòu)建獲取非常復(fù)雜。這種方法適用于有潔辟的碼農(nóng)們,我屬于這一種。
2、利用第三方類庫(kù)RazorEngine輸出,以下為關(guān)鍵代碼
- var template = "Hello @Model.Name! Welcome to Razor!";
- var viewData = new { Name = "World" });
- var result = Razor.Parse(template, viewData);
這代碼很清爽,一目了然,只不過(guò)要引入RazorEngine類庫(kù),而且效率不如前者。
五、代碼生成用戶界面
我們模板準(zhǔn)備好了,引擎準(zhǔn)備好了,那么還需要一個(gè)數(shù)據(jù)輸入viewData,我們做用戶界面的目的也就是為了更好的定義這個(gè)viewData。
這個(gè)用戶界面我們還是要把三種頁(yè)面的定義分開(kāi):
1、查詢頁(yè)面生成
***步,選擇代碼類別search(查詢頁(yè)面),選擇數(shù)據(jù)庫(kù),選擇業(yè)務(wù)主表,再勾選字段即可實(shí)現(xiàn)查詢條件部的設(shè)置,并且實(shí)現(xiàn)了拖拉排序功能。大家可以對(duì)照查詢模板看。
第二步,選擇grid中要顯示的列,并且設(shè)置屬性,格式化等
第三步,設(shè)置一些全局設(shè)定,主要根據(jù)這些參數(shù)確定命名空間,生成文件名等信息
點(diǎn)擊生成按鈕,按設(shè)定生成代碼,生成后彈出文件夾,已分別生成MVC三層代碼
mms_receive.cs
Index.cshtml
ReceiveController.cs
把這個(gè)代碼直接拷貝到項(xiàng)目中直接運(yùn)行,測(cè)試條件過(guò)濾都沒(méi)有問(wèn)題,grid會(huì)自適應(yīng)高度,grid遠(yuǎn)程排序,選擇分頁(yè)翻頁(yè)都沒(méi)有問(wèn)題,所有的功能都可用,
只有l(wèi)ookup控件彈出是空值,因?yàn)橹话芽刂圃O(shè)置為了lookup但沒(méi)有為它設(shè)置更詳細(xì)的選項(xiàng)。autocomplete也是同樣
即代碼生成器已經(jīng)生成了一個(gè)大的結(jié)構(gòu)及UI,一些小細(xì)節(jié)還是要手動(dòng)修改下,代碼生成的UI界面如果把每個(gè)控件的選項(xiàng)也做進(jìn)去會(huì)相當(dāng)?shù)膹?fù)雜,也沒(méi)有必要再細(xì)化了。
2、編輯頁(yè)面生成
***步,選擇主表編輯區(qū)的字段及控件類型,控件類型中的高級(jí)還未實(shí)現(xiàn),這個(gè)編輯的UI也可以參照編輯的模板看
第二步,添加tab頁(yè)簽,選擇頁(yè)簽類型(grid,form,empty) grid是指跟主表N:1關(guān)系,form是指跟主表1:1關(guān)系,empty是空頁(yè)簽,生成后自己可以添加內(nèi)容
這里我隨便添加三個(gè)tab頁(yè)簽tab1 tab2 tab3
tab1用來(lái)放人員變動(dòng)grid(跟主表關(guān)系N:1)
tab2就選擇form(跟主表關(guān)系1:1,也可以是主表本身)
tab3也隨便添些東西
第三步,其它設(shè)置
點(diǎn)擊生成按鈕,生成后自動(dòng)打開(kāi)文件夾
把這些代碼拷貝到項(xiàng)目中直接運(yùn)行
tab2
tab3,修改主表數(shù)據(jù),tab1,tab2,tab3點(diǎn)保存,能保存成功,
審核按鈕也可用,審核后單據(jù)不可修改
這個(gè)編輯功能基本上可以囊括很多的錄入頁(yè)面了,可以算是比較通用了
3、查詢編輯頁(yè)面(查詢編輯在同一個(gè)頁(yè)面內(nèi))頁(yè)面生成
***步,選擇查詢條件并設(shè)置控件類型
第二步,設(shè)置grid中的數(shù)據(jù)列,及編輯器
第三步,其它設(shè)置
點(diǎn)擊生成按鈕,生成后自動(dòng)打開(kāi)文件夾
把代碼直接拷貝到項(xiàng)目中運(yùn)行,結(jié)果如下,經(jīng)測(cè)試除了控件還需要進(jìn)一步設(shè)置,所有按鈕功能正常使用
#p#
六、代碼生成頁(yè)面的源碼
Index.cshtml
- @{
- ViewBag.Title = "代碼生成";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- @section head{
- }
- @section scripts{
- @Scripts.Render("~/Resource/Sys/Generator.js")
- }
- 代碼類別
- 數(shù)據(jù)庫(kù)名


咨詢
建站咨詢