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


167

Не знаю, якщо це відбувалося в 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в свій погляд на Бритву, він працює, але я б швидше просто ввійшов у ньогоWeb.config


2
Навіть вирішення проблеми не працює для мене. Метод розширення відобразиться в intelliSense, але видає помилку компіляції під час виконання.
Кларк

+1 для вирішення проблеми @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

Як свідчить прийнята відповідь, ви можете додати "використовувати" до всіх переглядів, додавши до розділу файла конфігурації.

Але для одного виду ви могли просто скористатися

@ використовуючи 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. Наступне вирішило його для мене:

Знайдіть "Веб-сторінки: Версія" в програмах та оновіть її до версії 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

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

Рішення: у вікні Провідника рішень клацніть правою кнопкою миші на вашому веб-проекті оберіть "Керувати пакунками нута ...", а потім встановіть "Microsoft ASP.NET Razor". Це дозволить переконатися, що правильно встановлений пакет, і він додасть необхідні записи у ваш файл web.config.



-6

Оскільки ASP.NET MVC 3 RTM відсутній, немає необхідності в розділі config для Razor. І ці розділи можна безпечно видалити.


Цікаво, чи це правда, nick4eva. Якщо я створив новий веб-додаток MVC 3 і вибрав перегляд Razorengine, web.config, який присутній у папці Views, матиме стандартні налаштування бритви за замовчуванням. Якщо я відключу їх, я отримаю помилки компіляції під час виконання.
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.