Расширения 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


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, чтобы автоматически убедиться, что у вас есть правильные значения конфигурации.

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


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.



-6

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


Интересно, правда ли это, nick4eva. Если я создаю новое веб-приложение MVC 3 и выбираю Razor viewengine, то в файле web.config, который присутствует в папке Views, будет по умолчанию бритва configSections. Если я отключу их, я получу ошибки компиляции во время выполнения.
MichaelvR

3
MichaelvR, да, это была моя ошибка. Извините, что вы вошли в замешательство.
nick4eva

Это также имеет значение для проекта MVC с питанием от VB? У меня нет доступа к моим методам расширения ... stackoverflow.com/questions/4789273/…
Ropstah

Этот ответ неверен. Эти записи конфигурации все еще необходимы. Новые шаблоны проектов уже имеют их, но если вы обновляете приложение Mvc 2, вам придется добавить их.
Marcind
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.