在这种情况下,我扩展了MvcWebRazorHostFactory,以便在构建时可以做一点额外的 View 魔术。确切的魔术并不重要。
我的〜\Views\Web.config中的注册如下所示:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />
在项目中有适当的程序集,在\lib文件夹中有该程序集的副本,并且我已经确认它已按预期复制到\bin中。此外,在构建 View 时确实会发生实际的 View 魔术操作,因此ASP.NET本身实际上可以找到所有内容。
在Visual Studio(2012)的Razor 语法突出显示中不起作用。
上面是语法突出显示如何失败的快照。通常,找不到在 namespace 中直接存在
@using
'd的任何内容(并因此获得红色波浪状的下划线),并且@model
指令不起作用。这表明在Web.config中获取我们的automatically included namespaces会遇到一些麻烦。@model
上错误的工具提示为“名称'model'在当前上下文中不存在”。通过反复试验,尽管我们对Razor进行了其他一些调整(例如自定义pageBaseType),但我还是将上述问题的根源缩小到了
host
config部分,但这一行打破了一切。到目前为止我尝试过的事情:
当强命名我的〜\Views\Web.config时,看起来像这样:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" />
我使用“gacutil -l”对照GAC检查了Version,Culture和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
。有时,在我对根本原因进行风选期间,在 View 的第一行会收到一条错误消息,提示“找不到StackExchange.MyNamespace.MyFactory”。下划线将为“其他错误”颜色(VS2012 Dark Theme中为紫色)。我无法可靠地重现该图像,因此无法获取屏幕截图。
所以我的问题是,有人知道如何让Visual Studio(2012年再次提供)以使用自定义宿主工厂正确处理Razor View 吗?
我目前对修复的最佳猜测是对Web.config进行了一些修改,因此我在编辑时有一个配置,而在调试时有一个配置。确实不是那个想法的拥护者。
看来这应该可行,并且Visual Studio只是在寻找所需的东西而麻烦。我只是不知道那是什么。
经过更多实验后进行更新。
我有更多的开发人员来重现它是
<host pageFactoryType="...">
,包括在原始MVC4应用程序中(上面的示例在某种程度上显然来自StackOverflow解决方案;这可能有些不足)。不过,我们已经找到了解决方法,那就是购买ReSharper许可证。不是一个很好的(或便宜的)解决方案,但是仍然需要一个解决方案。
安装了ReSharper后,所有操作都需要注意。如果您具有自定义的
<pages pageBaseType="...">
注册,则该类型必须在同一项目中,否则您不会获得Intellitense作为@this.Model
引用(尽管@model
指令有效)。更多更新。
如果您强命名它并将其安装在GAC中,则看起来无操作的HostFactory(扩展MvcRazorHostFactory但不重写任何方法或不包含任何其他代码的HostFactory)的效果很好。我相信我在较早测试时使用的是错误的GAC,但是(使用一些外部测试)能够使用显式的x64 gacutil使它正常工作。
现在的麻烦是弄清楚我的主机厂出了什么问题。发现更多详细信息。
最佳答案
与Microsoft进行一些讨论之后,我们找到了此问题的根本原因。
As usual, it was my code。
根本错误是自定义factoryType中的MVC3引用,尽管项目(及其周围的所有内容)都是 MVC4 。
综上所述,要使Visual Studio IntelliSense在具有自定义<host factoryType>
的.cshtml文件中工作:
请注意,在安装到GAC中之后,需要重新启动Visual Studio,仅重新加载解决方案(通常)是不够的。我们还发现,某些(但不是全部)ReSharper安装将需要清除其缓存,以便安全地清除缓存。
向驻留在GAC中的程序集添加引用时,Visual Studio不会默认将其复制到您的输出目录,这可能对您有用,但给我们带来了麻烦。您可以在引用的属性中进行更改。
另外,如果您的自定义工厂抛出任何异常,Visual Studio也会为您提供一些错误消息(我无法可靠地重现“其他错误”紫色下划线);除了可能在其构造函数中(这似乎有点不一致)。
在这种情况下,您无法获得帮助的情况就是类型本身存在严重问题。事情在运行时起作用只是一个巧合(我们正在玩的接口(interface)在MVC3和MVC4之间没有发生变化,其余部分则使用了弱命名)。
*如果您像我们一样并安装了MVC beta 1至4,请在此步骤中注意PEBKAC。
关于c# - 获取Visual Studio以使用自定义主机factoryType突出显示Razor语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12379879/