【问题标题】:Can MVC Views access all projects even though they aren't referenced by the project where the views are?MVC 视图是否可以访问所有项目,即使它们没有被视图所在的项目引用?
【发布时间】:2012-04-05 10:34:35
【问题描述】:

好的,所以我对以下数据的情况有点困惑。

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

  • Portal.Web - 一个 MVC 3 Web 应用程序,它基本上包含所有 视图、脚本、css 和 HTML 辅助扩展方法
  • Portal.Core - 一个基本上是我们的业务对象的类库,我们的所有模型都包含在这个项目中。
  • Portal.Data - 另一个包含 NHibernate 配置和 DTO 类的类库。

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

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

var client = new Client();

它不起作用,预计它不知道 Client 是什么,甚至指定一个 using 也不会削减它。没关系。

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

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

【问题讨论】:

  • resharper 是否也添加了参考?
  • 不,如果我用命名空间完全限定类型并且没有 resharper 的帮助,这只是一个红鲱鱼,不幸的是它仍然有效。
  • 那我明白你的困惑了!

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


【解决方案1】:

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

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

所以,我能得出的唯一结论是,这是使用 Razor 视图引擎的副作用。

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

【讨论】:

  • 感谢这个维尔纳,+1。我希望有人能够更多地了解 Razor 视图引擎如何获取它的引用并完全忽略项目引用。希望有人可能知道禁用此行为的方法。
  • 其实,经过进一步调查,您似乎是对的!清理解决方案使 Resharper 认为视图中有错误,然后数据项目实际上不再列在 Intellisense 中(因为它不再在 bin 文件夹中)。构建解决方案然后消除错误并且项目回到智能感知中。 Razor 可以有效地查看 bin 文件夹中的所有内容,并且似乎对此无能为力。答案是你的,再次感谢:)
猜你喜欢
  • 2014-08-12
  • 2019-07-08
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多