我想使用一些T4模板来生成从sql server(在本例中)派生的数据库模式的html文件.对于数据库中的每个表,我想创建2个文件:
tableName_List.aspx - 将包含在asp.net GridView中显示的相应html,并为每个db表列定义一个网格列
tableName_Edit.aspx - 将包含在asp.net FormView中显示的相应html ,每个db表列都有一个文本框(为简单起见,现在)
所以,如果我在数据库中有5个表,我会得到10个文件输出.我一直在谷歌上搜索并找到相关文章,但大多数似乎都没有解决这个问题.我也看到了使用亚音速的参考,但我宁愿不再引入另一种技术.
我正在尝试运行一个打开XML文件的T4模板,并使用它来生成代码工件.但是,当我尝试运行类似于下面的T4模板时,我收到一条错误消息
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Xml.dll" #>
<#@ assembly name="System.Xml.Linq.dll" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ output extension=".cs" #>
namespace ConsoleApplication1
{
<# XElement fragment = XElement.Load("data.xml"); #>
...
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2010错误列表显示以下消息
Running transformation: System.IO.FileNotFoundException: Could not find file 'C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\data.xml'.
It is trying to open the file on the path where the TextTemplateFileGenerator custom tool runs. I'd like it to open the file relative …
我正在设置我的新项目,并且想知道如何实现我的ViewModel类确实具有INotifyPropertyChanged支持,而不必亲自手动编码所有属性.
我查看了AOP框架,但我认为他们只会用另一个依赖项炸毁我的项目.
所以我考虑用T4生成属性实现.
设置是这样的:我有一个ViewModel类,它只声明它的Properties背景变量,然后我用T4从它生成Property Implementations.
例如,这将是我的ViewModel:
public partial class ViewModel
{
private string p_SomeProperty;
}
Run Code Online (Sandbox Code Playgroud)
然后T4将遍历源文件并查找名为"p_"的成员声明并生成如下文件:
public partial class ViewModel
{
public string SomeProperty
{
get
{
return p_SomeProperty;
}
set
{
p_SomeProperty= value;
NotifyPropertyChanged("SomeProperty");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有一些优点,但我不确定它是否真的有效.所以我想在StackOverflow上发布我的想法作为一个问题,以获得一些反馈,也许一些建议如何更好/更容易/更安全.
我有一个类似于这里描述的问题:MVC T4 MvcTextTemplateHost和自定义"控制器"T4模板,但希望,更简单.
我有一个用于ASP.NET MVC项目的自定义视图模板(View.tt,Create.tt).我无法弄清楚如何在这些视图模板中获取控制器名称.mvcHost.ControllerName和mvcHost.ControllerRootName在视图模板中都为空.但是,管道控制器名称中的某个位置是已知的,因为视图是在ControllerName文件夹中创建的.我想在模板本身中引用它.
具体来说,我想生成HTML.ActionLink("Edit", MVC.<controllername>.Edit(id))而不是HTML.ActionLink("Edit", "Edit", new {id = item.id})
是否可以在View模板中获取控制器的名称?
我有一个自定义的dll,里面有一个类,并且(为了简单起见),它上面有一个返回字符串的方法.
我有一个引用所述dll的项目,我想在该项目中使用一个(未预处理的)T4模板,该模板调用所述方法.我试过这个:
<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="MyDLL.dll" #>
<#@ output extension=".cs" #>
<#
var template = new MyDLL.MyNamespace.MyClass();
this.Write(template.Run());
#>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误14编译转换:找不到元数据文件"MyDLL.dll"
错误13命名空间不能直接包含字段或方法等成员
即使MyClass.Run()只是一个 return "//hello";
如何将项目相对包含在项目根目录中?有点像<# @include file="~/Infrastructure/Manager.ttinclude" #>
我一直在使用TextTemplatingFilePreprocessor上T4阅读文章展示了如何动态地生成成为项目的一部分,并与该项目编译的代码.
是否可以使用T4生成在运行时编译,输出到DLL并加载和执行的代码,所述代码可以访问与dll相关的常用可见性功能?
如果是的话,请你指点一个例子.
我有效地尝试使用IL生成动态dll,而不是使用C#.
编辑
我需要的具体案例很简单.我正在编写一个消息路由器,用于将消息路由到服务.服务可以是本地的或远程的.声明性脚本编译为C#.动态部分是"这项服务是本地还是远程服务?".输出C#相应地改变.本地/远程的路由风格不同,因此具有动态特性.
这是我需要的一个例子.
我的[Flags]代码中有一些枚举我想要暴露给JavaScript而不需要复制和粘贴.SignalR似乎通过将URL映射到返回由反射生成的JavaScript存根的Action来为其Hub代理做类似的事情.由于代码是在运行时生成的,因此似乎无法将其包含在Bundles中.
作为替代方案,我在设计时实现了一个T4模板来生成一个js文件:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="EnvDte" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".js" #>
Enums = {
<#
var visualStudio = (Host as IServiceProvider).GetService(typeof(EnvDTE.DTE))
as EnvDTE.DTE;
var project = visualStudio.Solution.FindProjectItem(this.Host.TemplateFile)
.ContainingProject as EnvDTE.Project;
foreach(EnvDTE.ProjectItem item in GetProjectItemsRecursively(project.ProjectItems))
{
if (item.FileCodeModel == null) continue;
foreach(EnvDTE.CodeElement elem in item.FileCodeModel.CodeElements)
{
if (elem.Kind == EnvDTE.vsCMElement.vsCMElementNamespace)
{
foreach (CodeElement innerElement …Run Code Online (Sandbox Code Playgroud) 我刚刚第一次尝试使用Visual Studio 2015打开我的一个项目,它说:
未找到importede项目"C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets".确认<Import>声明中的路径是正确的,并且该文件存在于磁盘上.
这些文件确实不存在于磁盘上.我需要安装什么样的SDK才能在VS 2015中使用文本模板?
我将project.json/ .xprojproject 迁移到较新的CS2017 .csproj格式.
该项目包含一个T4(.tt)模板文件.
它不会在保存或构建时重新生成其输出.输出.cs文件也没有嵌套在.tt文件下面.
为了让这个工作,我有什么必须做的吗?