[英]Is there anyway to generate Razor views (.cshtml) based on a template beside T4?
我正在開發一些代碼生成器,用於生成基於數據庫表的模型,控制器和視圖,因此我可以創建一個Asp.Net MVC3網站。 我現在可以使用CodeDOM生成模型和控制器但是為了生成視圖,我需要制作模板的東西,比如從.cs生成.cshtml,我認為T4會是個好主意,但我的一些同事堅持不使用T4,是還有其他方法嗎? 謝謝
我不確定為什么他們反對使用T4作為很多代碼庫,包括實體框架使用它們。 聽起來你正在做我剛剛完成的事情。 我喜歡使用Pre-Processed T4模板,因此我可以從C#代碼中將數據提供給它們並以這種方式生成文件。 這允許您輸出多個文件,基本上是用於傳入數據的參數。
我使用它的方式是..我創建了一個類,用於收集有關數據庫的所有信息..包含或排除哪些表...然后有關每個列的信息,如pk或身份可空等等。 我插入了預處理的t4模板,信息能夠生成所有的SQL,視圖,模型,控制器信息..每當數據庫發生變化時......我只是運行我的控制台應用程序並將其全部重新生成。
預處理: http : //odetocode.com/Blogs/scott/archive/2011/01/03/preprocessed-t4-templates.aspx
實體框架: http : //msdn.microsoft.com/en-us/data/gg558520.aspx
MVCScaffolding: http : //blog.stevensanderson.com/2011/04/06/mvcscaffolding-overriding-the-t4-templates/
T4MVC: http ://mvccontrib.codeplex.com/wikipage?title = T4MVC
我再次知道這無助於回答你的問題,但T4令人驚訝,我很想聽聽關於為什么不使用T4的爭論......它甚至內置!
順便說一下這里有一些智能感受!: http : //t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html
如果你有任何問題請隨時打我,我喜歡T4,我願意回答任何問題。
下面是我用來生成POCO模型的模板的示例..由於使用我的普通c#方法傳遞數據的預處理能力,已經提取了很多。這個模板為我創建了55個模型,基於數據庫中的表。
我的“SchemeCollector”使用我創建的DatabaseInfo,TableInfo和ColumnInfo類來保存我需要的所有模式。 然后我有9個其他t4模板也使用SchemaCollector類來填充數據。
這是我用來將數據傳遞到模板中進行生成的擴展。 我有這個設置也使用XML文件進行配置但是沒必要我只是希望它真的可以重用。
public partial class PocoGenerator
{
public string Namespace { get; set; }
public string Inherit { get; set; }
public DatabaseInfo Schema { get; set; }
public bool Contract { get; set; }
public string SavePath { get; set; }
}
這是我用來調用和填充模板並保存它的方法。
static void GeneratePoco(Config config)
{
var template = config.Poco;
template.Schema = config.DatabaseInfo;
File.WriteAllText(template.SavePath, template.TransformText());
Console.WriteLine(" - POCOs generated for " + config.DatabaseInfo.DatabaseName + " complete");
}
這是模板
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ assembly name="System.Xml.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="CodeGenerator.Utilities" #>
using System;
using System.Runtime.Serialization;
namespace My.Models
{ <#
List<TableInfo> tables = Schema.Tables;
#>
//#########################################################################################################
// This file has been generated from the tables contained in the <#= Schema.DatabaseName #> database.
// Changes to this file will be overwritten when the file is regenerated. Generated: <#= DateTime.Now #>
//#########################################################################################################
<#
foreach (TableInfo table in tables)
{
#>
[DataContract]
public class <#= table.Name #> : IConfigTable
{
<#
PushIndent(" ");
foreach (ColumnInfo col in table.Columns)
{
if(col.IsKey || col.IsIdentity)
WriteLine("[Key]");
WriteLine("[DataMember]");
if(col.IsNullable && col.Type != "string")
WriteLine("public " + col.Type + "? " + col.Name+ " { get; set; }");
else
WriteLine("public " + col.Type + " " + col.Name+ " { get; set; }");
}PopIndent();#>
}
<# } #>
}
您的答案在這里: https : //stackoverflow.com/a/2457206/538387
其中包含ASP.NET MVC和虛擬視圖的鏈接
我們廣泛使用了代碼smith並編寫了一個插件。 使用t4雖然你可以簡單地生成類然后刪除模板 - 為什么反對那里的T4?
當然,我通過使用漂亮的擴展RazorGenerator將Razor用於我的所有代碼生成(以及電子郵件生成等)。 它允許您將此擴展指定為“自定義工具”,並從您的.cshtml
輸入生成一個結果C#類,您可以調用(並傳入@model
)將文本轉換為您喜歡的任何輸出。 (有點諷刺的是,在你的情況下,它會是razor => razor轉換)
我們有類似的任務,我們正在創建基於輸入json文件和表單定義的動態Web表單。 編輯器指定應在表單上顯示的不同控件(控件包含不同的屬性,操作,驗證器)。 下面我將嘗試描述我們邏輯的基本過程:
模型中的所有屬性都具有[UIHint]屬性,其中包含部分視圖的名稱。 我們有大約10個部分視圖知道如何表示每個屬性。 為了支持這種邏輯,我們擴展了ViewEngine和ModelMetadata提供程序。
ViewEngine在其他文件夾中查找視圖。 ModelMetada提供程序添加到“AdditionalValues”自定義屬性。
我們對模型的看法有一行
@Html.EditorForModel()
我們已經覆蓋了Object.cshtml以處理“深度綁定”。 最困難的部分是收藏品,其中收藏品是復雜類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.