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

mat*_*mmo 8 .net c# asp.net-mvc razor asp.net-mvc-3

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

我们的应用程序中包含以下结构:

  • 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();
Run Code Online (Sandbox Code Playgroud)

它将无法工作,预计它不知道客户端是什么,甚至指定使用不会削减它.没关系.

但是如果我尝试在View中完全相同的行,Resharper将使用添加到视图然后没有抱怨,项目运行,我们可以在视图中使用DTO类.

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

blo*_*aak 2

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

编译 razor 视图的过程似乎添加了对 bin 文件夹中所有程序集的引用。但是,查看 ASP.NET MVC 的源代码,我无法确认这一点。

所以,我能得出的唯一结论是,这是使用 Razor View Engine 的副作用。

也就是说,您可能需要扫描 web.config 以查看它是否是使用assembly 元素包含的。