Как добавить дополнительные пространства имен на страницы Razor вместо объявления @using?

146

Есть ли какая-то магия, которую мне нужно использовать, чтобы получить пространства имен в pages/namespacesэлементе в webconfig?

<pages>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>

Вышесказанное просто не хочет работать. Я знаю, что с пространством имен все в порядке, потому что, когда я помещаю @using MyCustomHelpersверхнюю часть страницы, оно волшебным образом работает.

Это так, чтобы я мог заставить Html.SomeFunction()работать без необходимости помещать @usingв верхней части всех моих страниц

MyNameIsJob
источник
1
какой релиз MVC 3 вы используете?
Марсинд
Я использовал MVC 3 Preview, поэтому другой ответ работал для меня и все еще работает, даже после обновления ... однако ваш ответ кажется более подходящим для новой версии, которую я обновлю в ближайшее время. Позор, я не могу принять два ответа.
MyNameIsJob
Из комментариев в ответах не ясно, но в MVC4 пространство имен необходимо добавить в файл Web.Config в папке \ Views, а НЕ в приложение Web.Config. Раздел <system.web.webPages.razor>конфигурации должен уже существовать в ЭТОМ Web.Config!
Бен Макинтайр

Ответы:

163

Обновление : взгляните на мой обновленный ответ, относящийся к MVC 3 RC: расширения Razor HtmlHelper (или другие пространства имен для представлений) не найдены

Это изменилось между MVC 3 Preview 1 и MVC 3 Beta (выпущено только сегодня). В Preview 1 Razor использовал раздел конфигурации пространств имен WebForms. Однако в бета-версии есть новый раздел конфигурации, который отделен от WebForms. Вам нужно будет добавить следующее в ваш файл 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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

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

Обратите внимание, что есть другие изменения в том, что требуется в web.config, чтобы заставить Razor работать в MVC3 Beta, поэтому лучше было бы взглянуть на ~\View\Web.configфайл, который поставляется в шаблонах проектов Beta.

marcind
источник
2
FWIW, я обнаружил, что pageBaseType="System.Web.Mvc.WebViewPage"атрибут также требуется. Я обновил ваш ответ.
Портман
1
Это то же самое, что вы сделали бы для MVC 3 RC?
Кларк
1
+1 СПАСИБО. Я потратил слишком много времени, пытаясь найти ответ на эту проблему сегодня.
Джессегавин
32
вам, скорее всего, придется закрыть и снова открыть файл .cshtml, если он не работает или выдает ошибку
Simon_Weaver
1
@ Симон да, нужно обновить заново открыть файл. Редактор сейчас не отслеживает изменения web.config.
Марсинд
50

Если вы поместите объявление пространства имен в Web.configкорневую папку «Views» и / или в папку «Views» текущей области (в зависимости от того, где находится ваше представление) - оно должно работать как положено.

Buildstarted
источник
6

Я нашел этот http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx, который объясняет, как добавить пользовательское пространство имен для всех ваших страниц бритвы.

В основном вы можете сделать это

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

и поместите следующий код в свой AssemblyInfo.cs

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

метод InitializeApplication будет выполнен перед Application_Start в global.asax

к-DEV
источник
Метод перемещен в System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
17
4

Для чего стоит другой метод - просто поместить свой вспомогательный класс расширения в пространство имен System, которое по умолчанию уже включено механизмом представления. Например:

namespace System.Web.Mvc
{
    public static class HtmlHelper_MyExtensions
    {
        ...
    }
}

Таким образом, до тех пор, пока ссылка на библиотеку, содержащую класс, будет видна всем. Поскольку вы расширяете System.Web.Mvcкласс, кажется разумно разместить методы расширения в одном и том же пространстве имен.

Питер
источник