【发布时间】:2026-01-01 11:35:01
【问题描述】:
这是场景,我扩展了MvcWebRazorHostFactory,所以我可以在构建时做一些额外的视图魔术。确切的魔法并不重要。
我的 ~\Views\Web.config 中的注册如下所示:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />
项目中有相应的程序集,该程序集的副本位于 \lib 文件夹中,并且我已确认它已按预期复制到 \bin。此外,真正的视图魔法确实会在构建视图时发生,因此 ASP.NET 本身实际上正在查找所有内容。
Visual Studio (2012) 的 Razor 语法突出显示 中的哪些问题。
以上是语法高亮失败的快照。通常,不能找到任何不在命名空间中的直接@using'd(因此得到红色波浪下划线)并且@model 指令不起作用。这表明在 Web.config 中访问我们的 automatically included namespaces 时遇到了一些麻烦。
@model 上的错误提示是“当前上下文中不存在名称‘模型’”。
通过反复试验,我已将根本原因缩小到上述 host 配置部分,尽管我们对 Razor 进行了一些其他调整(例如自定义 pageBaseType),但正是这一行破坏了一切。
到目前为止我尝试过的事情:
- 强大的程序集命名
- 在 GAC 中安装程序集
- This page 暗示这是必要的。
当我的 ~\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="...">,包括在一个普通的 MVC4 应用程序中(上面的例子,有点明显,来自 * 解决方案;它可能有些笨拙)。
不过,我们找到了解决办法,那就是购买ReSharper 许可证。不是一个很好(或便宜)的解决方法,但仍然是一种解决方法。
安装 ReSharper 后,一切正常,需要注意一点。如果您有自定义的<pages pageBaseType="..."> 注册,则类型必须在同一个项目中,否则您无法获得@this.Model 引用的智能感知(尽管@model 指令有效)。
更多更新。
看起来像一个无操作 HostFactory(扩展 MvcRazorHostFactory 但不覆盖任何方法或包含任何其他代码)工作正常如果您对其进行强命名并将其安装在 GAC 中。我相信我之前测试时使用了错误的 GAC,但是(在一些外部刺激下)能够使用明确的 x64 gacutil 使其工作。
现在的问题是找出我的特定主机工厂出了什么问题;更多细节随着他们被发现。
【问题讨论】:
标签: c# razor asp.net-mvc-4 visual-studio-2012