Здесь сценарий, я расширил MvcWebRazorHostFactory, поэтому я могу сделать немного дополнительной магии просмотра во время сборки. Точная магия не имеет значения.
Регистрация в моем ~\Views\Web.config выглядит так:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />
Там, к соответствующей сборке в проекте, копия сборки в папке \lib, и я подтвердил, что она скопирована в \bin, как ожидалось. Кроме того, реальная магия представления происходит при построении представлений, поэтому сам ASP.NET на самом деле находит все.
Что не работает в Visual Studio (2012) Razor Подсветка синтаксиса.
Выше представлен снимок того, как сбой подсветки синтаксиса. Как правило, ничего не в пространстве имен, непосредственно @using
'd не может быть найдено (и, таким образом, получает красную красноватую подчеркивание), а директива @model
не работает. Это указывает на некоторые проблемы с получением автоматически включаемых пространств имен в Web.config.
Подсказка для ошибки на @model
: "Имя" модель "не существует в текущем контексте".
Сквозь пробную версию и ошибку я сузил основную причину в разделе выше host
config, хотя у нас есть некоторые другие настройки вокруг Razor (пользовательский pageBaseType), это одна строка, которая разбивает все.
Вещи, которые я пробовал до сих пор:
- Сильное именование сборки
- Установка сборки в GAC
- Эта страница подсказывает, что это необходимо.
При сильном имени my ~\Views\Web.config выглядит так:
<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" />
Я проверил версию, культуру и PublicKeyToken против GAC, используя "gacutil -l".
Я полагаю, что другой возможной точкой отказа является сам 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
.
Иногда во время моего winninging к первопричине я получаю сообщение об ошибке "Эффект StackExchange.MyNamespace.MyFactory не найден" в первой строке представления. Подчеркивание будет в цвете "Другая ошибка" (фиолетовый в темной теме VS2012). Я не мог достоверно воспроизвести это, поэтому я не могу получить скриншот.
Итак, мой вопрос: кто-нибудь знает, как заставить Visual Studio (2012 снова) правильно обрабатывать Razor Views с помощью настраиваемого хоста factory?
Мое последнее лучшее предположение об исправлении делает некоторые действительно взломанные замены Web.config, поэтому у меня есть одна конфигурация при редактировании, а другая - при отладке. На самом деле не поклонник этой идеи.
Кажется, что это должно сработать, и что Visual Studio просто беспокоит поиск чего-то, что ему нужно. Я просто не знаю, что это такое.
Обновление после нескольких экспериментов.
У меня есть больше разработчиков, чтобы воспроизвести, что это <host pageFactoryType="...">
, в том числе в приложении vanilla MVC4 (приведенные выше примеры, несколько явно, из решения StackOverflow, которое могло иметь некоторый треск).
Мы нашли работу, хотя, чтобы купить лицензию ReSharper. Не большая (или дешевая) работа вокруг, но работа вокруг все равно.
С установленным ReSharper все работает с одним оговором. Если у вас есть пользовательская регистрация <pages pageBaseType="...">
, тип должен быть в одном проекте или вы не получите intellisense для ссылки @this.Model
(хотя работает директива @model
).
Дополнительные обновления.
Похоже, что no-op HostFactory (тот, который расширяет MvcRazorHostFactory, но не отменяет каких-либо методов или содержит какой-либо другой код) отлично работает , если, вы его сильно назовите и установите в GAC. Я считаю, что использовал неправильный GAC при тестировании ранее, но (с некоторым внешним подталкиванием) смог заставить его работать, используя явно x64 gacutil.
Теперь проблема заключается в выяснении того, что не так с моим конкретным хостом factory; более подробные сведения поступают по мере их обнаружения.