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

Не знаю, произошло ли это в PR или Beta, но если я создам метод расширения на 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

Ответ 1

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

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

Ответ 2

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

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

@using SomeNamespace.Extensions

Ответ 3

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

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

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

Ответ 4

У меня была эта проблема в VS 2015. Для меня это решено:

Найдите "веб-страницы: Версия" в настройках приложения и обновите его до версии 3.0.0.0. У моего web.config был

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

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

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

Ответ 5

Я обнаружил, что этот раздел в моем 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>

Ответ 6

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

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

Ответ 7

В моем случае используйте VS 2013, и он не поддерживает MVC 3 изначально (даже вы меняете. /Views/web.config): fooobar.com/questions/12991/...

Ответ 8

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