MVC T4 MvcTextTemplateHost 和定制“控制器” T4模板
我正在创建自己的自定义 T4 模板,该模板与我的 MVC Web 应用程序中包含的 ADO.NET 实体框架模型(.edmx 文件)集成。
供参考
请简要查看以下两个 URL。
- Scott Hanselman - “T4 代码生成 Visual Studio 最佳保密”
- Visual Web 开发人员团队博客- ASP.NET MVC 开发人员快速入门指南
我想要实现的目标的简短描述
使用 T4 引擎生成带有基于 ADO.NET 实体框架模型主键的 Action 方法的 MVC 控制器类。
我现在拥有的
- MVC T4 模板文件(例如,Controller.tt、Create.tt 等...) 已包含在我的 MVC Web 项目中。
- 我的“Models”文件夹中有一个 ADO.NET Entity Framework MyModel.edmx 文件。
根据控制器名称(例如“ProductController”),我想检索“Product”类的[System.Type]信息来自 ADO.NET 实体框架模型。 我希望能够以与 MVC View T4 文件(例如 Edit.tt) 相同的方式检索 System.Type 信息,如下所示。
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost) (Host);
Type type = mvcHost.ViewDataType;
最终目标
我想创建控制器方法代码生成以通过反射从 ADO.NET 实体框架类读取主键信息等
和
为编辑、详细信息、添加操作等生成基本的 CRUD 操作和方法签名...
我陷入困境
但是,正如您从ASP.NET MVC 开发人员快速入门指南文章中看到的那样,我无法检索[System.Type] 用于 Controller T4 模板,因为 MvcTextTemplateHost 类仅公开用于创建 MVC 视图的 ViewDataType 属性。
我尝试通过以下技术检索 [System.Type] 不起作用,因为 modelType 返回为 null ,这意味着它找不到该类型。
Type modelType = Type.GetType(modelFullyQualifiedName, false, true);
我假设发生这种情况是因为实体框架模型作为我的 MVC Web 项目的一部分包含在内,而没有作为已编译的 .DLL 库程序集的一部分包含在内。
一些可以帮助我找到解决方案的东西
- 在哪里可以找到 MvcTextTemplateHost 类的源代码? 如果我至少能找到 DLL 文件,我也许可以看看代码如何加载在 Visual Studio “添加视图”对话框窗口中输入的类型信息。
- 有没有办法通过 Visual Studio IDE API 从我的 T4 模板动态检索 Visual Studio 项目中包含的类的 System.Type 信息?
如果有人能在这个主题上帮助我,我将非常感激,因为这将使我能够为 ADD、EDIT、DETAILS 等的 MVC 控制器操作方法生成 75% 的代码以及基本的 CRUD 操作代码。
I am creating my own custom T4 Template that integrates with an ADO.NET Entity Framework Model (.edmx file) included in my MVC Web Application.
For Reference
Please take a brief look at the following two URLs.
- Scott Hanselman - "T4 Code Generation Visual Studio Best Kept Secret"
- Visual Web Developer Team Blog - Quick Start Guide for ASP.NET MVC Developers
Short Description of What I am trying to Achieve
Use the T4 engine to generate the MVC Controller class with Action methods based on the ADO.NET Entity Framework Model's Primary Key(s).
What I Have Right Now
- MVC T4 Template files (e.g., Controller.tt, Create.tt, etc...) have been included as part of my MVC Web Project.
- I have an ADO.NET Entity Framework MyModel.edmx file in the "Models" folder.
Based on the Controller name (e.g. "ProductController"), I want to retrieve the [System.Type] information of the "Product" class from the ADO.NET Entity Framework model.
I want to be able to retrieve System.Type information the same way as the MVC View T4 files (e.g. Edit.tt) as below.
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost) (Host);
Type type = mvcHost.ViewDataType;
Final Goal
I want to create the Controller method code-generation to read Primary Key information and etc from the ADO.NET Entity Framework Class via Reflection
and
generate basic CRUD operations and method signatures for EDIT, DETAILS, ADD operations etc...
Where I am Stuck
However, as you can see from Quick Start Guide for ASP.NET MVC Developers article, I cannot retrieve [System.Type] for Controller T4 Template because the MvcTextTemplateHost class exposes only ViewDataType property for creating MVC Views.
My attempt to retrieve the [System.Type] by the following technique is NOT working because the modelType is being returned as null meaning it can't find the type.
Type modelType = Type.GetType(modelFullyQualifiedName, false, true);
I am assuming that this happens because the Entity Framework Model is included as part of my MVC Web Project and not included as part of a compiled .DLL library assembly.
Some Things that Will Help Me Find the Solution
- Where do I find the Source Code for the MvcTextTemplateHost class? If I can find at least the DLL file, I can probably look at how the code loads the Type information entered in the Visual Studio "Add View" dialog window.
- Is there a way to dynamically retrieve System.Type information of a Class included in the Visual Studio project from my T4 Template through the Visual Studio IDE API?
I would really appreciate if anyone can help me on this topic as this will allow me to generate 75% of the code for MVC Controller Action Methods for ADD,EDIT,DETAILS, etc.. and basic CRUD operation code.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用Reflector从C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\Microsoft.VisualStudio.Web.Extensions.dll程序集中反编译MvcTextTemplateHost的源代码。
是的,您可以使用 CodeModel< 从 Visual Studio 加载类型元数据/a>. 但是,您最好直接从 edmx 文件中读取它。 不管怎样,这都是一项艰巨的任务。 可能有一个可用示例说明如何以 VS 2010 中的 EF T4 模板的形式执行此操作。
You can use Reflector to decompile source code of MvcTextTemplateHost from C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\Microsoft.VisualStudio.Web.Extensions.dll assembly.
Yes, you can load type metadata from a Visual Studio using CodeModel. However, you may be better off reading it from the edmx file directly. Either way, this is a substantial task. There may be a usable example of how to do this in the form of EF T4 template in VS 2010.