Jak dodać dodatkowe przestrzenie nazw do stron Razor zamiast deklaracji @using?

146

Czy jest jakiś rodzaj magii, którego potrzebuję, aby uzyskać przestrzenie nazw w pages/namespaceselemencie w 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>

Powyższe po prostu nie chce działać. Wiem, że przestrzeń nazw jest w porządku, ponieważ kiedy umieszczam znak @using MyCustomHelpersna górze strony, działa magicznie.

Ma to na celu umożliwienie mi Html.SomeFunction()działania bez konieczności umieszczania @usingna górze wszystkich moich stron

MyNameIsJob
źródło
1
której wersji MVC 3 używasz?
marcind
Używałem MVC 3 Preview, więc druga odpowiedź działała dla mnie i nadal działa, nawet po aktualizacji ... jednak twoja odpowiedź wydaje się bardziej odpowiednia dla nowej wersji - do której zaktualizuję wkrótce. Szkoda, że ​​nie mogę przyjąć dwóch odpowiedzi.
MyNameIsJob
Nie jest to jasne z komentarzy w odpowiedziach, ale w MVC4 przestrzeń nazw musi zostać dodana do pliku Web.Config w folderze \ Views, a NIE aplikacji Web.Config. Sekcja <system.web.webPages.razor>konfiguracji powinna już istnieć w THAT Web.Config!
Ben McIntyre

Odpowiedzi:

163

Aktualizacja : spójrz na moją zaktualizowaną odpowiedź, która dotyczy MVC 3 RC: Razor HtmlHelper Extensions (lub innych przestrzeni nazw dla widoków) Nie znaleziono

Zmieniło się to między MVC 3 Preview 1 i MVC 3 Beta (wydanym właśnie dzisiaj). W wersji zapoznawczej 1 Razor użył sekcji konfiguracji przestrzeni nazw WebForms. Jednak w wersji beta jest nowa sekcja konfiguracji, która jest oddzielna od sekcji WebForms. Będziesz musiał dodać follwing do swojego pliku web.config (lub po prostu zacznij od zupełnie nowego projektu z szablonu):

<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>

Pamiętaj , że może być konieczne zamknięcie i ponowne otwarcie pliku, aby zmiany zostały odebrane przez redaktora.

Zwróć uwagę, że istnieją inne zmiany w tym, co jest wymagane w pliku web.config, aby Razor działał w MVC3 Beta, więc najlepiej przyjrzeć się ~\View\Web.configplikowi, który jest dostarczany w szablonach projektów Beta.

marcind
źródło
2
FWIW, stwierdziłem, że pageBaseType="System.Web.Mvc.WebViewPage"atrybut jest również wymagany. Zaktualizowałem twoją odpowiedź.
Portman
1
Czy w ten sam sposób zrobiłbyś to dla MVC 3 RC?
Clark
1
+1 DZIĘKUJEMY. Spędziłem dziś zbyt wiele czasu, próbując znaleźć odpowiedź na ten problem.
jessegavin
32
najprawdopodobniej będziesz musiał zamknąć i ponownie otworzyć plik .cshtml, jeśli nie działa lub wyświetla błąd
Simon_Weaver,
1
@Simon tak, musisz zaktualizować ponownie otworzyć plik. Obecnie edytor nie oczekuje zmian w pliku web.config.
marcind
50

Jeśli umieścisz deklarację przestrzeni nazw w Web.configgłównym folderze „Widoki” i / lub w folderze „Widoki” bieżącego obszaru (w zależności od tego, gdzie jest twój widok) - powinno działać zgodnie z oczekiwaniami.

Buildstarted
źródło
6

Znalazłem http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx, który wyjaśnia, jak dodać niestandardową przestrzeń nazw do wszystkich stron maszynki do golenia.

Zasadniczo możesz to zrobić

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

i umieść następujący kod w swoim AssemblyInfo.cs

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

metoda InitializeApplication zostanie wykonana przed Application_Start w global.asax

k-dev
źródło
Metoda została przeniesiona do System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath
4

Inną techniką jest po prostu umieszczenie pomocniczej klasy rozszerzenia w przestrzeni nazw System, która jest już domyślnie uwzględniona przez silnik widoku. Na przykład:

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

W ten sposób, dopóki istnieje odwołanie do biblioteki zawierającej klasę, wszystko ją zobaczy. Ponieważ rozszerzasz System.Web.Mvcklasę, wydaje się rozsądnie dopuszczalne umieszczenie metod rozszerzających w tej samej przestrzeni nazw.

Piotr
źródło