Як додати додаткові простори імен на сторінки 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вгорі всі свої сторінки


1
який випуск MVC 3 ви використовуєте?
marcind

Я використовував попередній перегляд MVC 3, тому інша відповідь працювала на мене і досі працює, навіть після оновлення ... однак ваша відповідь здається більш підходящою для нової версії - до якої я незабаром оновлю. Сором, я не можу прийняти дві відповіді.
MyNameIsJob

Це не зрозуміло з коментарів у відповідях, але в MVC4 простір імен потрібно додати до файлу Web.Config у папці \ Views, а не у програмі Web.Config. Розділ <system.web.webPages.razor>конфігурації вже повинен існувати в ТОМУ Web.Config!
Бен Макінтайр,

Відповіді:


163

Оновлення : перегляньте мою оновлену відповідь, що стосується MVC 3 RC: Розширення HtmlHelper Розширення (або інші простори імен для переглядів) Не знайдено

Це змінилося між MVC 3 Preview 1 та MVC 3 Beta (випущено сьогодні). У Preview 1 Razor використовував розділ конфігурації просторів імен 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.


2
FWIW, я виявив, що pageBaseType="System.Web.Mvc.WebViewPage"атрибут також необхідний. Я оновив вашу відповідь.
Портман

1
Це той самий спосіб, який ви зробили б для MVC 3 RC?
Кларк

1
+1 ДЯКУЙТЕ Я витратив занадто багато часу, намагаючись знайти відповідь на цю проблему сьогодні.
jessegavin

32
вам, швидше за все, потрібно буде закрити і знову відкрити файл .cshtml, якщо він не працює або не дає помилки
Simon_Weaver

1
@Simon так, вам потрібно оновити повторно відкритий файл. Зараз редактор не стежить за змінами web.config.
marcind

50

Якщо ви помістите декларацію про простір імен в Web.configкорінну папку "Перегляди" та / або папку "Перегляди" поточної області (залежно від того, де ви переглядаєте) - вона повинна працювати так, як очікувалося.


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


Метод переміщено до System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath

4

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

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

Таким чином, доки бібліотека, що містить клас, посилається на все. Оскільки ви розширюєте System.Web.Mvcклас, здається розумним прийнятним розміщення методів розширення в одному просторі імен.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.