Asp.net mvc 如何在ASP.NETMVC中实现一个(sorta)不是';基于t文件?

Asp.net mvc 如何在ASP.NETMVC中实现一个(sorta)不是';基于t文件?,asp.net-mvc,t4,viewengine,custom-view,Asp.net Mvc,T4,Viewengine,Custom View,我已经创建了一个相当通用的版本,我最初创建的版本没有针对ASP.NETMVC。不过现在,我认为把它放到MVC项目可以轻松使用的地方是个好主意。我想知道我的项目是否能很好地映射到ASP.NETMVC风格 我遇到的问题是,我的视图引擎在编译时通过T4模板生成所有内容。这意味着大部分内容都是静态类型的。然而,大多数MVC似乎有点松散 因此,对于某些视图,您可能会生成以下代码: class MyView{ public string Foo{get;set;} public int Bar{ge

我已经创建了一个相当通用的版本,我最初创建的版本没有针对ASP.NETMVC。不过现在,我认为把它放到MVC项目可以轻松使用的地方是个好主意。我想知道我的项目是否能很好地映射到ASP.NETMVC风格

我遇到的问题是,我的视图引擎在编译时通过T4模板生成所有内容。这意味着大部分内容都是静态类型的。然而,大多数MVC似乎有点松散

因此,对于某些视图,您可能会生成以下代码:

class MyView{
  public string Foo{get;set;}
  public int Bar{get;set;}
  public string Render(){
    return "This is my view: "+Foo+(string)Bar;
  }
}
而且由于它的工作方式,即使有一个views/FooView.html文件,它也可能被处理成一个名为
MyView
的类

那么,将MyView的
ViewData
指定为
Foo
Bar
的最佳方式是什么呢?我是否应该限制您只能在视图中使用单个字段(基本上是
ViewData
)或

我看到的另一个主要问题是MVC几乎完全基于文件。当你说
RenderView(“MyView”,data)时它将在/views/中查找名为MyView.aspx的文件或任何文件(当然,您可以更改它的查找位置和文件扩展名)。问题是
MyView
可能是从名为
FooView.html
的文件编译而来的。基本上,我应该为每个可用视图生成一个巨大的列表,其中包含从类名到文件系统名的映射吗?还是有更好的办法


注意:由于我从T4模板生成所有视图(可能还可以生成MVC视图引擎),这意味着我可以编写大量列表和其他极其乏味或糟糕的代码。但我觉得在这种情况下,有一种比庞大的列表更好的方法,而且只保留列表会有潜在的问题。

您可以扩展我基于T4的视图引擎,从模型创建类文件,在内存中编译并缓存它,并通过反射将视图模型传递给编译后的程序集


所以你必须通过反射来完成吗?而且,我真的很想在编译时编译视图。我已经制作了我的视图引擎,它不能与使用IView的MVC一起工作。为什么不在生成的类上实现IView呢?然后继承VirtualPathProviderViewEngine并创建一个视图引擎-mvct4viewengine.codeplex.com/SourceControl/changeset/view/…。并使用反射创建已编译的视图类实例,并调用该实例的render方法。传递给具体IView的ViewContext应该包含视图模型信息