Wie füge ich Razor-Seiten zusätzliche Namespaces hinzu, anstatt eine @ using-Deklaration zu verwenden?

146

Gibt es eine Art Magie, die ich verwenden muss, um die Namespaces im pages/namespacesElement in der Webkonfiguration abzurufen?

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

Das obige will einfach nicht funktionieren. Ich weiß, dass der Namespace in Ordnung ist, denn wenn ich ihn @using MyCustomHelpersoben auf die Seite setze, funktioniert er auf magische Weise.

Dies ist so, dass ich das Html.SomeFunction()zum Laufen bringen kann, ohne @usingoben auf alle meine Seiten setzen zu müssen

MyNameIsJob
quelle
1
Welche Version von MVC 3 verwenden Sie?
Marcind
Ich habe MVC 3 Preview verwendet, daher hat die andere Antwort für mich funktioniert und funktioniert auch nach dem Upgrade noch. Ihre Antwort scheint jedoch für die neue Version besser geeignet zu sein - auf die ich in Kürze aktualisieren werde. Schade, dass ich zwei Antworten nicht akzeptieren kann.
MyNameIsJob
Aus den Kommentaren in den Antworten geht nicht hervor, aber in MVC4 muss der Namespace zur Datei Web.Config im Ordner \ Views hinzugefügt werden, NICHT zur Anwendung Web.Config. Der <system.web.webPages.razor>Konfigurationsabschnitt sollte bereits in THAT Web.Config!
Ben McIntyre

Antworten:

163

Update : Bitte werfen Sie einen Blick auf meine aktualisierte Antwort, die für MVC 3 RC gilt: Razor HtmlHelper Extensions (oder andere Namespaces für Ansichten) Nicht gefunden

Dies hat sich zwischen MVC 3 Preview 1 und MVC 3 Beta (erst heute veröffentlicht) geändert. In Vorschau 1 verwendete Razor den Konfigurationsabschnitt für WebForms-Namespaces. In der Beta gibt es jedoch einen neuen Konfigurationsabschnitt, der von dem WebForms-Abschnitt getrennt ist. Sie müssen Folgendes zu Ihrer web.config-Datei hinzufügen (oder einfach mit einem brandneuen Projekt aus der Vorlage beginnen):

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

Beachten Sie, dass Sie möglicherweise die Datei schließen und erneut öffnen müssen, damit die Änderungen vom Editor übernommen werden.

Beachten Sie, dass in web.config weitere Änderungen an den Anforderungen erforderlich sind, damit Razor in MVC3 Beta funktioniert. Sehen Sie sich daher am besten die ~\View\Web.configDatei an, die in den Beta-Projektvorlagen enthalten ist.

Marcind
quelle
2
FWIW, ich habe festgestellt, dass das pageBaseType="System.Web.Mvc.WebViewPage"Attribut auch erforderlich ist. Ich habe Ihre Antwort aktualisiert.
Portman
1
Ist das genauso, wie Sie es für MVC 3 RC tun würden?
Clark
1
+1 DANKE. Ich habe heute viel zu viel Zeit damit verbracht, die Antwort auf dieses Problem zu finden.
Jessegavin
32
Sie müssen höchstwahrscheinlich die .cshtml-Datei schließen und erneut öffnen, wenn sie nicht funktioniert oder einen Fehler verursacht
Simon_Weaver
1
@ Simon Ja, Sie müssen aktualisieren, um die Datei erneut zu öffnen. Der Editor sucht derzeit nicht nach Änderungen an web.config.
Marcind
50

Wenn Sie Ihre Namespace-Deklaration im Web.configStammordner "Ansichten" und / oder im Ordner "Ansichten" des aktuellen Bereichs ablegen (je nachdem, wo sich Ihre Ansicht befindet), sollte dies wie erwartet funktionieren.

Buildstarted
quelle
6

Ich habe diese http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx gefunden, in der erklärt wird, wie Sie all Ihren Rasiermesserseiten einen benutzerdefinierten Namespace hinzufügen.

Grundsätzlich können Sie dies machen

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

und fügen Sie den folgenden Code in Ihre AssemblyInfo.cs ein

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

Die Methode InitializeApplication wird vor Application_Start in global.asax ausgeführt

k-dev
quelle
Methode nach System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport verschoben ("Fully.Qualified.Namespace");
Agrath
4

Eine andere Technik besteht darin, Ihre Helfer-Erweiterungsklasse einfach in einen System-Namespace zu stellen, der standardmäßig bereits von der View Engine enthalten ist. Beispielsweise:

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

Auf diese Weise wird alles angezeigt, solange auf die Bibliothek verwiesen wird, die die Klasse enthält. Da Sie eine System.Web.MvcKlasse erweitern, erscheint es vernünftigerweise akzeptabel, die Erweiterungsmethoden in denselben Namespace zu stellen.

Peter
quelle
0

Versuchen Sie, die Ansicht zu schließen und erneut zu öffnen, nachdem Sie sichergestellt haben, dass die Änderungen an der web.config im Stammverzeichnis der Ansicht vorgenommen wurden.

Das Schließen und Wiedereröffnen hat mein Problem behoben.

Siehe hier:

ASP.NET MVC 4-Namespace-Problem in der Rasiereransicht

eaglei22
quelle