繁体   English   中英

获取Visual Studio以使用自定义主机factoryType突出显示Razor语法

[英]Get Visual Studio to highlight Razor syntax with a custom host factoryType

在这种情况下,我扩展了MvcWebRazorHostFactory,以便在构建时可以做一点额外的视图魔术。 确切的魔术并不重要。

我的〜\\ Views \\ Web.config中的注册如下所示:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />

在项目中有适当的程序集,在\\ lib文件夹中有该程序集的副本,我已经确认它已按预期复制到\\ bin中。 此外,构建视图时确实发生了真正的视图魔术,因此ASP.NET本身实际上可以找到所有内容。

在Visual Studio(2012)的Razor 语法突出显示中不起作用。

在此处输入图片说明

上面是语法突出显示如何失败的快照。 通常,找不到在名称空间中直接@using的任何内容(并因此获得红色波浪状下划线),并且@model指令不起作用。 这表明在Web.config中获取我们自动包含的名称空间有些麻烦。

@model@model错误的工具提示是“名称'model'在当前上下文中不存在”。

通过反复试验,尽管我们对Razor进行了其他一些调整(例如自定义pageBaseType ),但我还是将上述问题的根源缩小到上述host配置部分,但这一行打破了一切。

到目前为止我尝试过的事情:

  • 强烈命名程序集
  • 在GAC中安装组件

当强命名后,我的〜\\ 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

有时,在我对根本原因进行风选期间,在视图的第一行会收到一条错误消息,提示“找不到StackExchange.MyNamespace.MyFactory”。 下划线将为“其他错误”颜色(VS2012 Dark Theme中为紫色)。 我无法可靠地重现该图像,因此无法获取屏幕截图。


所以我的问题是,有人知道如何让Visual Studio(2012年再次提供)以使用自定义宿主工厂正确处理Razor视图吗?

我目前对修复的最佳猜测是对Web.config进行了一些真正的修改,因此在编辑时有一个配置,在调试时有一个配置。 确实不是那个想法的拥护者。

看来这应该可行,而Visual Studio只是在麻烦地寻找它需要的东西。 我只是不知道那是什么。


经过更多试验后进行更新。

我有更多的开发人员来重现它是<host pageFactoryType="..."> ,包括在原始MVC4应用程序中(上面的示例在某种程度上显然来自StackOverflow解决方案;这可能有些不足)。

不过,我们已经找到解决方法,那就是购买ReSharper许可证。 不是很好的(或便宜的)解决方案,但是仍然需要解决。

安装了ReSharper后,所有操作都需要注意。 如果您具有自定义的<pages pageBaseType="...">注册,则该类型必须位于同一项目中,否则您不会获得@this.Model引用的智能提示(尽管@model指令有效)。


更多更新。

如果您强命名它并将其安装在GAC中,则它看起来像无操作HostFactory(扩展MvcRazorHostFactory但不覆盖任何方法或包含任何其他代码的HostFactory)工作正常。 我相信我在较早测试时使用的是错误的GAC,但是(使用一些外部测试)能够使用显式的x64 gacutil使它正常工作。

现在的麻烦是弄清楚我的主机厂出了什么问题。 发现更多细节。

与Microsoft进行一些讨论之后,我们找到了此问题的根本原因。

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

根本错误是自定义factoryType中的MVC3引用,尽管项目(及其周围的所有内容)都是MVC4

综上所述,要使Visual Studio IntelliSense在具有自定义<host factoryType> .cshtml文件中工作:

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

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

向驻留在GAC中的程序集添加引用时,Visual Studio不会默认将其复制到您的输出目录,这可能对您有用,但给我们带来了麻烦。 您可以在引用的属性中进行更改。

在此处输入图片说明

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

在这种情况下,您无法获得帮助的情况就是类型本身存在严重问题。 事情在运行时起作用只是一个巧合(我们正在玩的接口在MVC3和MVC4之间没有发生变化,其余部分则使用了弱命名)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM