簡體   English   中英

反正是否有基於T4旁邊的模板生成Razor視圖(.cshtml)?

[英]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表單。 編輯器指定應在表單上顯示的不同控件(控件包含不同的屬性,操作,驗證器)。 下面我將嘗試描述我們邏輯的基本過程:

  1. Deserilize並驗證json文件。
  2. 准備將傳遞給T4模板的數據。
  3. 從數據生成MVC模型和控制器(步驟2)。
  4. 生成其他類(例如,某些幫助程序,模型中的復雜類型)。
  5. 添加到程序集嵌入資源,如dataSources等,任何圖像。
  6. 編譯上面的所有內容。
  7. 在模型文件夾中刪除dll。
  8. 重啟網站。

模型中的所有屬性都具有[UIHint]屬性,其中包含部分視圖的名稱。 我們有大約10個部分視圖知道如何表示每個屬性。 為了支持這種邏輯,我們擴展了ViewEngine和ModelMetadata提供程序。

ViewEngine在其他文件夾中查找視圖。 ModelMetada提供程序添加到“AdditionalValues”自定義屬性。

我們對模型的看法有一行

@Html.EditorForModel()

我們已經覆蓋了Object.cshtml以處理“深度綁定”。 最困難的部分是收藏品,其中收藏品是復雜類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM