MVC Views是否可以访问所有项目,即使它们没有被视图所在的项目引用?

时间:2012-04-05 10:34:35

标签: c# .net asp.net-mvc asp.net-mvc-3 razor

好的,所以我对以下数据发生了什么感到困惑。

我们的申请中有以下结构:

  • Portal.Web - 一个基本上包含所有内容的MVC 3 Web应用程序 视图,脚本,CSS和HTML帮助程序扩展方法
  • Portal.Core - 一个基本上是我们的Business Objects的类库,我们在这个项目中包含了所有模型。
  • Portal.Data - 另一个包含我们的NHibernate配置和DTO类的类库。

这是我们的用法:在控制器中,我们调用位于Portal.Core中的模型,该模型通过调用Portal.Data进行填充​​,因此Web基本上看不到数据。

这里有一个问题:在控制器中,比方说,我试着像实例一样实例化一个名为Client的新DTO对象:

var client = new Client();

它不起作用,预计它不知道客户端是什么,甚至指定使用不会削减它。没关系。

但是如果我尝试在视图中完全相同的行,Resharper将使用添加到视图中,然后没有投诉,项目运行,我们可以在视图中使用DTO类。 / p>

所以问题是,这是为什么?我试图阻止我们的青少年在Views中使用DTO类,所以我故意删除了对Web中的Data项目的引用,但他们仍然可以使用这些类。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

我使用ASPX和Razor视图运行相同的测试。在ASPX视图中引用Client失败但是在Razor视图中它们起作用。当您请求应用程序时,视图会动态编译,因此我查看了“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files \ portal.web”中的一些文件夹,并从中查看编译视图时,将显式添加cmdline文件对程序集的引用。

编译剃刀视图的过程似乎会添加对bin文件夹中所有程序集的引用。但是,看看ASP.NET MVC的来源,我无法证实这一点。

因此,我能得出的唯一结论是它是使用Razor View引擎的副作用。

也就是说,您可能希望扫描web.config以查看它是否包含在assemblies element中。