这是场景,我扩展了 MvcWebRazorHostFactory,所以我可以在构建时做一些额外的视图魔术。确切的魔法并不重要。
我的 ~\Views\Web.config 中的注册如下所示:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />
项目中有相应的程序集,该程序集的副本位于 \lib 文件夹中,并且我已确认它已按预期复制到 \bin。此外,实际的视图魔术确实在构建视图时发生,因此 ASP.NET 本身实际上是在查找所有内容。
什么在 Visual Studio (2012) 的 Razor Syntax Highlighting中不起作用。
上面是语法高亮失败的快照。通常,不能找到任何不在命名空间中的内容@using
(因此会得到红色波浪下划线),并且该@model
指令不起作用。这表明我们在 Web.config 中自动包含命名空间时遇到了一些麻烦。
错误的工具提示@model
是“当前上下文中不存在名称‘模型’”。
通过反复试验,我将根本原因缩小到上述host
配置部分,尽管我们对 Razor 进行了一些其他调整(例如自定义pageBaseType),但那一行破坏了一切。
到目前为止我尝试过的事情:
- 强命名程序集
- 在 GAC 中安装程序集
- 该页面暗示这是必要的。
当强烈命名我的 ~\Views\Web.config 最终看起来像这样:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" />
我使用“gacutil -l”针对 GAC 检查了版本、文化和 PublicKeyToken。
我想另一个可能的故障点是 GAC 本身,因为我的盒子上有大量的 .NET 版本。程序集和网站都是使用 .NET 4.5 构建的(均引用 MVC 4、Razor 2 等)。gacutil
我在调试时使用的路径是Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\gacutil.exe
.
有时,在我筛选根本原因的过程中,我会在视图的第一行收到一条错误消息,大意是“找不到 StackExchange.MyNamespace.MyFactory”。下划线将是“其他错误”颜色(VS2012 Dark Theme 中的紫色)。我无法可靠地重现它,所以我无法获得屏幕截图。
所以我的问题是,有谁知道如何让 Visual Studio(再次 2012 年)使用自定义主机工厂正确处理 Razor 视图?
我目前对修复的最佳猜测是做一些非常hacky的Web.config替换,所以我在编辑时有一个配置,在调试时有另一个。虽然真的不喜欢这个想法。
看起来这应该可以工作,而且 Visual Studio 只是在寻找它需要的东西时遇到了麻烦。我只是不知道那是什么。
更多实验后更新。
我有更多的开发人员来重现它<host pageFactoryType="...">
,包括在 vanilla MVC4 应用程序中(显然,上面的示例来自 StackOverflow 解决方案;它可能有些笨拙)。
不过,我们找到了解决办法,那就是购买ReSharper许可证。不是一个很好(或便宜)的解决方法,但仍然是一个解决方法。
安装 ReSharper 后,一切正常。如果您有自定义<pages pageBaseType="...">
注册,则该类型必须在同一个项目中,否则您将无法获得智能感知以供@this.Model
参考(@model
尽管该指令有效)。
更多更新。
如果您对其进行强命名并将其安装在 GAC 中,则看起来像无操作 HostFactory(扩展 MvcRazorHostFactory 但不覆盖任何方法或包含任何其他代码)工作正常。我相信我在之前测试时使用了错误的 GAC,但是(通过一些外部刺激)能够使用明确的 x64 gacutil 使其工作。
现在的麻烦是找出我的特定主机工厂出了什么问题;更多细节随着他们被发现。