2016/06/18

[筆記] 使用自訂的 Scaffold Templates 來加快 ASP.NET MVC 的開發

最近要開發的新系統終於準備好要開始投入大量人力開發了

由於多人開發上要要求每個人在某某功能的版面時要按照怎樣的結構來刻 HTML 有難度 

加上之前跟某位朋友聊天時提到他們家有使用 Scaffold Templates

故想說.... 與其一直宣導該怎樣寫,不如讓大家預設拿到的就是結構已經長好的頁面


ASP.NET MVC 預設的 Scaffold Templates 路徑是在

 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates

當中 (Visual Studio 版本不同路徑版號會不一樣)

在自己的專案中開一個叫做 CodeTemplates 的目錄,然後把 Templates 目錄下的整個結構長到自己的專案中

(畢竟要每個開發人員去動自己電腦的這個目錄也是挺.... 困難的)

然後 View 的幾個目錄裡面的

Imports.include.t4
ModelMetadataFunctions.cs.include.t4

也塞過來一下 (這兩個太好用了)

整個結構大概像這樣

這部份只有長我專案需要的結構,沒有設定的範本會抓預設路徑內的範本使用

諸如像 MvcArea 或是 ApiController 等如果有需要額外定義也是可以拉進來寫



不知道怎麼開始寫  Scaffold Templates  可以先拿原本目錄裡面的 t4 檔來參考一下

不過自己剛開始點開時會有點痛苦,因為沒有程式碼上色也沒有提示可以用

這邊推薦 Devart T4 Editor for Visual Studio 這個套件,可以在編輯時給你上述原本沒有的兩個功能

然後就可以開始修改自己的範本了

controller 的部份像我自己的專案有額外再墊一層處理其他的工作

所以在專案範本部分 Controller 就改為繼承自自己定義的 Controller

內容大致如下


 
<#@ template language="C#" HostSpecific="True" #>
<#@ output extension="cs" #>
<#@ parameter type="System.String" name="ControllerName" #>
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="Namespace" #>
<#@ parameter type="System.String" name="AreaName" #>
<#
string routePrefix;
if (String.IsNullOrEmpty(AreaName)) 
{
    routePrefix = ControllerRootName;
}
else
{
    routePrefix = AreaName + "/" + ControllerRootName;
}
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using My.Product.Core;

namespace <#= Namespace #>
{
    public class <#= ControllerName #> : MyBaseController
    {
        // GET: <#= routePrefix #>
        public ActionResult Index()
        {
            return View();
        }
    }
}

緊接著是 View 的範本

View 分別放在兩個目錄中,分別是 MvcView 跟 MvcViewWithoutModel

顧名思義就是一個要吃 Model,一個不用~

跟 Controller 不一樣的是,View 這邊的 t4 檔可以隨意新增自己要的名稱

譬如我就新增了專案比較常用到的 QueryForm.t4 以及 InputForm.t4

以及在 MvcViewWithoutModel 的目錄當中增加了 Grid.t4

在 MvcVIew 當中比較可惜的是由於 Imports.include.t4 所定義的 ModelMetadata 型態是

Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata

就不能再去處理 Model 內 property 的 attributes ,像是對應必填欄位要長 required 的 css 等,這就得靠 Programmer 去補了

至於這個寫好的範本怎麼用?  照原本新增檔案的方式就好~~

增加好 Scaffold Templates 之後新增好 Controller 後就會看到預設的繼承不再是 Controller 而是 MyBaseController

預設的 using 也多增加了 My.Product.Core; 這行

View 範本的部份一樣是 右鍵 -> Add -> View

差別在於 Template 的下拉選單中可以看到額外在專案中定義的 View Scaffold Template 了


以上,都搞定之後Programmer 就可以過著幸福快樂的日子了


ref:
https://www.credera.com/blog/technology-insights/microsoft-solutions/create-custom-scaffold-templates-asp-net-mvc/
http://weblogs.asp.net/imranbaloch/customizing-the-asp-net-mvc-5-web-api-2-scaffolding-templates

沒有留言:

張貼留言