首先感謝大家對Magicodes.NET框架的支持。就如我上篇所說,框架成熟可能至少還需要一年,畢竟個人力量實在有限。希望有興趣的小伙伴能夠加入我們並且給予貢獻。同時有問題的小伙伴請不要在群里詢問問題,QQ群僅限於技術交流。
所有有關Magicodes.NET的問題,請在此https://github.com/magicodes/Magicodes.NET/issues頁面根據類型提交相應Issues。在使用Magicodes.NET之前,請先查看官方文檔並且閱讀FAQ(點此閱讀)。
上篇提到了T4代碼生成,隨着生成的深入,我愈發覺得這種生成模式存在問題:
- 太過依賴前端腳本(增刪改查都在同一個頁面處理,后台控制器只是返回View)
- 不便於更換頁面主題(前端太重)
- View對服務器端代碼支持不夠好(因為基本上都是依賴前端JS綁定的)。
- 不便於擴展或者擴展起來比較麻煩。比如新增和編輯時,下拉框的綁定,復選框組的綁定(當然這些都有解決辦法),都需要編寫大量通用的腳本。隨着數據模型的復雜,這種方式維護會越來越麻煩。
基於以上原因,本人決定放棄此模式,開始新的T4模板生成研究之旅。
很多時候,只有重新再來,才能站得更高。所以我說框架成熟可能至少還得一年,因為我還在不斷的嘗試和學習。也希望小伙伴們能夠多多支持,大牛們能夠多多指導。
在研究的時候,我將目光定格到了ASP.NET Scaffolding上……
ASP.NET Scaffolding Template(ASP.NET基架模板)
ASP.NET Scaffolding。可能很多小伙伴們沒聽說過,但是其實你已經在用它呢。這玩意兒是微軟的一個工程師編寫的,然后集成到了VS2013中。這是個什么玩意兒呢?看看下面的圖你可能就想起來了。
添加控制器的時候:
然后選擇模型類,DbContext等:
點擊添加后,你就會發現他干了很多碉堡了的事:
控制器和增刪改查都生成好了!!!
我們來看看生成的控制器代碼:
增刪改查一應俱全,而且還考慮到了安全性。同樣的,相關視圖也生成好了,能夠展示簡單的列表以及增刪改。
具體請看:http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview
我們來看看生成的原始界面:
雖然灰不溜秋,但是不失為一種很強大的方式。好像瞬間把代碼生成拉高了幾個檔次,個人覺得這種方式相當不錯。給我的第一感覺是,媽的,好高大上啊,老子要自定義。
自定義ASP.NET MVC基架
關於ASP.NET MVC基架的資料國內還比較欠缺,翻牆研究了一會,也有一點成效:
是不是瞬間又高大上了很多?人靠衣裳啊,別介意,這個還不夠美。只是粗淺的。想想,如果能夠根據控件類型生成相應JS控件,再加點邏輯控制,那就完美了!!
廢話不說,我們先來看看怎么自定義這玩意兒。
第一步,安裝SideWaffle:
可以在這個網址下載:http://sidewaffle.com/
第二步,選擇ASP.NET基架T4文件:
然后,你就會發現項目工程里多了一個CodeTemplates目錄,里面有很多T4文件:
這就是MVC基架T4模板(包括WebAPI等等),然后我們就可以Happy的定制了,只是目前是:
比如編輯模板,我們可以加點樣式點綴點綴:
於是就成了上面的樣子。
剛Happy不久,然后發現問題來了!!!
ASP.NET MVC基架模板的問題
比如在List.cs.t4模板里,我需要獲取模型類的類特性,方便干點壞事。比如獲取列表標題啊等等,然后我發現我杯具了。先來看看模板參數(在文件Imports.include.t4中):
<#@ parameter type="System.String" name="ViewDataTypeName" #>
<#@ parameter type="System.String" name="ViewDataTypeShortName" #>
<#@ parameter type="System.Boolean" name="IsPartialView" #>
<#@ parameter type="System.Boolean" name="IsLayoutPageSelected" #>
<#@ parameter type="System.Boolean" name="ReferenceScriptLibraries" #>
<#@ parameter type="System.Boolean" name="IsBundleConfigPresent" #>
<#@ parameter type="System.String" name="ViewName" #>
<#@ parameter type="System.String" name="LayoutPageFile" #>
<#@ parameter type="System.String" name="JQueryVersion" #>
<#@ parameter type="Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata" name="ModelMetadata" #>
從參數不難看出,我們能夠用的就是這些了。默哀一會。然后我們發現微軟那哥們給我們打開了一扇窗子,自己卻被門夾了腦袋。我們唯一可以寄托希望的參數在類型:Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata
咦,這玩意兒咋這么眼熟,咋一看跟MVC的ModelMetadata還有EF的ModelMetadata有點像。但其實差的有點遠。
就給我這么點東西,模型類型都拿不到,你讓我咋玩!!!同樣的屬性也是拿不到類型的,媽蛋,讓我白高興了一把。微軟那哥們,哥知道參數T4模板不好寫,參數傳過來還經過了序列化,不大好傳遞類型,不然反序列化會有問題,但是你丫的也想想辦法呀,都是你家東西,你就搭了一個宏偉的架子,然后就沒了,讓哥情何以堪!!果然只是基架。為此,哥還在stackoverflow上用蹩腳的英語提了一個問題:
這是博客園的飛機票:http://q.cnblogs.com/q/69370/
好吧,為了便於T4模板參數傳遞,微軟那哥們是將ViewModel的屬性處理好然后通過參數傳遞過來的,T4模板參數用到了序列化和反序列化,如果傳遞模型類型,就得把相關dll丟GAC里面,於是就成現在這樣了。自然,理論上應該是無解,於是無奈放棄。
尾聲
看來偉大的想法行不通啊,看來還是自己老老實實重新寫過吧。目前控制器這塊的T4生成已經重構了,准備開始重新編寫View的T4模板了。開啟全新模式,我將在下篇介紹新的T4模板生成。
╮(╯▽╰)╭,蛋疼。














