Расширения Razor HtmlHelper (или другие пространства имен для представлений) не найдены

167

Не знаю, происходило ли это в PR или в бета-версии, но если я создал метод расширения HtmlHelper, он не распознается на странице с поддержкой Razor:

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

Я добавил его в <Namespaces>раздел Web.config:

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

Но он выдает ошибку компиляции при попытке просмотра страницы:

@Html.Foo()

Если я воссоздаю страницу с WebForms, она работает нормально. В чем дело?

Временное решение

Если я включу @using SomeNamespace.Extensionsв свое представление Razor, то это сработает, но я бы предпочел просто иметь его вWeb.config

swilliams
источник
2
Даже обходной путь не работает для меня. Метод расширения будет отображаться в intelliSense, но выдает ошибку компиляции во время выполнения.
Кларк
+1 за обходной путь @using. Я предпочитаю это в моем случае.
Кент
@using обходного пути подходит для одного просмотра. Но для нескольких представлений управление кодом становится проблемой.
Рахатур

Ответы:

274

Начиная с бета-версии, Razor использует другой раздел конфигурации для глобального определения импорта пространства имен. В вашем Views\Web.configфайле вы должны добавить следующее:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
      <!-- Your namespace here -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

Используйте инструмент обновления MVC 3, чтобы автоматически убедиться, что у вас есть правильные значения конфигурации.

Обратите внимание, что вам может потребоваться закрыть и снова открыть файл для изменений, которые будут приняты редактором.

marcind
источник
1
Я пропускаю ссылку на сборку? Он не распознает System.Web.Mvc.WebViewPage и другие типы в разделе configSections.
Кларк
4
Мне пришлось добавить ссылку на> System.Web.WebPages.Razor, и она разобралась.
TWith2Sugars
4
Это не работает для меня. Я использую MVC 3 RC, я добавил свое пространство имен в web.config в моей папке представлений. Все еще не вижу мои расширения на странице Razor. Событие, помещающее @using <extensionname>, не работает. @ TWith2Sugars Я даже не могу найти System.Web.WebPages.Razor для добавления, я добавил System.Web.Razor, но это не помогло. Я действительно застрял здесь
freddoo
31
+1 за указание открыть и закрыть файл, чтобы увидеть обновления.
Амир
26
Спасибо, что указали, что это не корневой web.config, а web.config в папке View!
G-Wiz
11

Как следует из принятого ответа, вы можете добавить «использование» ко всем представлениям, добавив их в раздел конфигурационного файла.

Но для одного просмотра вы можете просто использовать

@using SomeNamespace.Extensions

Пол Роуленд
источник
6

У меня была такая же ошибка в приложении MVC 4 с использованием Razor. В попытке очистить файлы web.config я удалил два webpages:значения конфигурации:

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
  <add key="webpages:Enabled" value="false" />

Как только я восстановил эти значения конфигурации, страницы компилировались бы правильно, и ошибки, касающиеся .Partial()метода расширения, исчезли.

Джон Раш
источник
5

У меня была эта проблема в VS 2015. Следующее решило это для меня:

Найдите "webpages: Version" в настройках приложения и обновите его до версии 3.0.0.0. Мой web.config имел

<add key="webpages:Version" value="2.0.0.0" />

и я обновил его до

<add key="webpages:Version" value="3.0.0.0" />
Дамиан Грин
источник
3

Я обнаружил, что размещение этого раздела в моем web.config для каждой папки просмотра решает эту проблему.

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
Джозеф Морган
источник
1
Я действительно обнаружил, что по какой-то причине ROOT web.config имел перенаправление привязки, которое вызывало мою проблему (в частности, указывал 0.0.0.0-2.0.0.0на 1.0.0.0), и /View/web.configфайл не переопределял это. (Кроме того, я не верю, что это нужно в каждом /View/Subfolder/)
JoeBrockhaus
1

Эта ошибка говорит о том, что у вас нет бритвенного движка, правильно связанного с вашим проектом.

Решение. В окне обозревателя решений щелкните правой кнопкой мыши свой веб-проект и выберите «Управление пакетами Nuget ...», затем установите «Microsoft ASP.NET Razor». Это обеспечит правильную установку пакета и добавит необходимые записи в ваш файл web.config.

user3459730
источник
-6

Поскольку ASP.NET MVC 3 RTM отсутствует, нет необходимости в разделе конфигурации для Razor. И эти разделы могут быть безопасно удалены.

nick4eva
источник
Интересно, правда ли это, nick4eva. Если я создаю новое веб-приложение MVC 3 и выбираю Razor viewengine, то в файле web.config, который присутствует в папке Views, будет по умолчанию бритва configSections. Если я отключу их, я получу ошибки компиляции во время выполнения.
MichaelvR
3
MichaelvR, да, это была моя ошибка. Извините, что вы вошли в замешательство.
nick4eva
Это также имеет значение для проекта MVC с питанием от VB? У меня нет доступа к моим методам расширения ... stackoverflow.com/questions/4789273/…
Ropstah
Этот ответ неверен. Эти записи конфигурации все еще необходимы. Новые шаблоны проектов уже имеют их, но если вы обновляете приложение Mvc 2, вам придется добавить их.
Marcind