反正是否有基于T4旁边的模板生成Razor视图(.cshtml)?

时间:2012-10-13 20:49:15

标签: c# asp.net-mvc-3 templates code-generation

我正在开发一些代码生成器,用于生成基于数据库表的模型,控制器和视图,因此我可以创建一个Asp.Net MVC3网站。我现在可以使用CodeDOM生成模型和控制器但是为了生成视图,我需要制作模板的东西,比如从.cs生成.cshtml,我认为T4会是个好主意,但我的一些同事坚持不使用T4,是还有其他方法吗?谢谢

5 个答案:

答案 0 :(得分:5)

我不确定为什么他们反对使用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();#>     
    }
    <# } #>
}

答案 1 :(得分:2)

你的答案在这里:https://stackoverflow.com/a/2457206/538387

其中包含指向ASP.NET MVC and virtual views

的链接

答案 2 :(得分:0)

我们广泛使用了代码smith并且还编写了一个插件。使用t4虽然你可以简单地生成类然后删除模板 - 为什么反对那里到T4?

答案 3 :(得分:0)

当然,我使用好的扩展程序RazorGenerator将Razor用于我的所有代码生成(以及电子邮件生成等)。它允许您将此扩展指定为“自定义工具”,并从您可以调用的.cshtml输入生成一个结果C#类(并传入@model)以将文本转换为您输出的任何内容喜欢。 (在你的情况下,有点讽刺的是,它会是razor =&gt; razor转换)

答案 4 :(得分:0)

我们有类似的任务,我们正在创建基于输入json文件和表单定义的动态Web表单。编辑器指定应在表单上显示的不同控件(控件包含不同的属性,操作,验证器)。 下面我将尝试描述我们逻辑的基本过程:

  1. Deserilize并验证json文件。
  2. 准备将传递给T4模板的数据。
  3. 从数据生成MVC模型和控制器(步骤2)。
  4. 生成其他类(例如,某些帮助程序,模型中的复杂类型)。
  5. 添加到程序集嵌入资源,如dataSources等,图像无论如何。
  6. 编译上面的所有内容。
  7. 在模型文件夹中删除dll。
  8. 重新启动网站。
  9. 模型中的所有属性都有 [UIHint] 属性,其中包含部分视图的名称。我们有大约10个部分视图知道如何表示每个属性。为了支持这种逻辑,我们扩展了ViewEngine和ModelMetadata提供程序。

    ViewEngine在其他文件夹中查找视图。 ModelMetada提供程序添加到“AdditionalValues”自定义属性。

    我们对模型的看法有一行

    @Html.EditorForModel()
    

    我们已经覆盖了Object.cshtml以处理“深度绑定”。最困难的部分是收藏品,其中收藏品属于复杂类型。