10

这是场景,我扩展了 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 使其工作。

现在的麻烦是找出我的特定主机工厂出了什么问题;更多细节随着他们被发现。

4

1 回答 1

6

经过与微软的一些讨论,我们找到了这个问题的根本原因。

像往常一样,这是我的代码

根本错误是自定义 factoryType 中的 MVC3 引用,尽管项目(及其周围的一切)是MVC4

总结一下,让 Visual Studio IntelliSense 在 .cshtml 文件中使用自定义<host factoryType>

  • 你必须强命名你的程序集
  • 您必须在 GAC 中安装程序集
    • 我们仍然针对本地副本进行调试和部署,但 VS 将查看 GAC
  • 必须拥有所有正确的参考资料*

请注意,您需要在安装到 GAC 后重新启动 Visual Studio,仅仅重新加载解决方案(通常)是不够的。我们还发现,一些(但不是全部)ReSharper 安装需要清除其缓存,以确保清除缓存。

添加对驻留在 GAC 中的程序集的引用时的一个小问题是 Visual Studio 默认不会将其复制到您的输出目录,这可能对您有用,但给我们带来了问题。您可以在参考的属性中更改它。

在此处输入图像描述

此外,如果您的自定义工厂抛出任何异常,Visual Studio会给您一些错误消息(“其他错误”紫色下划线我之前无法可靠地重现);除了可能在它的构造函数中(这似乎有点不一致)。

在我们遇到的情况下,您没有得到任何帮助,类型本身存在严重问题。事情在运行时工作只是一个巧合(我们正在使用的接口在 MVC3 和 MVC4 之间没有改变,剩下的就是弱命名)。

*如果您像我们一样安装了 MVC beta 1 到 4,请注意此步骤中的 PEBKAC。

于 2012-09-13T19:41:15.643 回答