在这种情况下,我扩展了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部分,但这一行打破了一切。

到目前为止我尝试过的事情:
  • 强命名程序集
  • 在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检查了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中安装该程序集
  • 我们仍然针对本地副本进行调试和部署,但是VS会在GAC中查找
  • 您必须具有所有正确的引用*

  • 请注意,在安装到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/

    10-11 23:40