Razor HtmlHelper Extensions (oder andere Namespaces für Ansichten) nicht gefunden

167

Keine Ahnung, ob dies in der PR oder Beta passiert ist, aber wenn ich eine Erweiterungsmethode auf erstelle HtmlHelper, wird dies auf einer von Razor betriebenen Seite nicht erkannt:

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

Ich habe es dem <Namespaces>Abschnitt hinzugefügt in Web.config:

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

Beim Versuch, die Seite anzuzeigen, wird jedoch ein Kompilierungsfehler ausgegeben:

@Html.Foo()

Wenn ich die Seite mit WebForms neu erstelle, funktioniert es einwandfrei . Was ist das Problem?

Problemumgehung

Wenn ich es @using SomeNamespace.Extensionsin meine Razor-Ansicht einbeziehe, funktioniert es, aber ich möchte es lieber einfach habenWeb.config

Swilliams
quelle
2
Selbst die Problemumgehung funktioniert bei mir nicht. Die Erweiterungsmethode wird in IntelliSense angezeigt, löst jedoch zur Laufzeit einen Kompilierungsfehler aus.
Clark
+1 für die @ using-Problemumgehung. Ich bevorzuge es in meinem Fall.
Kent
@ using Workaround ist für eine einzelne Ansicht in Ordnung. Bei mehreren Ansichten wird die Codeverwaltung jedoch zu einem Problem.
Rahatur

Antworten:

274

Seit der Beta verwendet Razor einen anderen Konfigurationsabschnitt zum globalen Definieren von Namespace-Importen. In Ihrer Views\Web.configDatei sollten Sie Folgendes hinzufügen:

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

Verwenden Sie das MVC 3-Upgrade-Tool, um automatisch sicherzustellen, dass Sie die richtigen Konfigurationswerte haben.

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

Marcind
quelle
1
Fehlt mir eine Montagereferenz? System.Web.Mvc.WebViewPage oder einer der Typen im Abschnitt configSections wird nicht erkannt.
Clark
4
Ich musste einen Verweis auf> System.Web.WebPages.Razor hinzufügen und es wurde aussortiert.
TWith2Sugars
4
Es funktioniert nicht für mich. Ich verwende MVC 3 RC und habe meinen Namespace zur Datei web.config in meinem Ansichtsordner hinzugefügt. Ich kann meine Erweiterungen immer noch nicht auf der Razor-Seite sehen. Das Einfügen von @ using <Erweiterungsname> funktioniert nicht. @ TWith2Sugars Ich kann nicht einmal System.Web.WebPages.Razor zum Hinzufügen finden. Ich habe System.Web.Razor hinzugefügt, aber nicht geholfen. Ich stecke wirklich hier fest
Freddoo
31
+1 für die Aufforderung, die Datei zu öffnen und zu schließen, um die Aktualisierungen anzuzeigen.
Amir
26
Vielen Dank, dass Sie darauf hingewiesen haben, dass dies nicht die Root-Datei web.config ist, sondern die Datei web.config im Ordner View!
G-Wiz
11

Wie aus der akzeptierten Antwort hervorgeht, können Sie allen Ansichten "using" hinzufügen, indem Sie sie zum Abschnitt der Konfigurationsdatei hinzufügen.

Aber für eine einzelne Ansicht könnten Sie nur verwenden

@ using SomeNamespace.Extensions

Paul Rowland
quelle
6

Ich hatte den gleichen Fehler in einer MVC 4-Anwendung mit Razor. Bei dem Versuch, die Dateien web.config zu bereinigen, habe ich die beiden webpages:Konfigurationswerte entfernt:

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
  <add key="webpages:Enabled" value="false" />

Sobald ich diese Konfigurationswerte wiederhergestellt habe, wurden die Seiten korrekt kompiliert und die Fehler bezüglich der .Partial()Erweiterungsmethode verschwanden.

John Rasch
quelle
5

Ich hatte dieses Problem in VS 2015. Folgendes hat es für mich gelöst:

Suchen Sie in den Appsettings nach "Webseiten: Version" und aktualisieren Sie sie auf Version 3.0.0.0. Meine web.config hatte

<add key="webpages:Version" value="2.0.0.0" />

und ich habe es aktualisiert

<add key="webpages:Version" value="3.0.0.0" />
Damian Green
quelle
3

Ich habe festgestellt, dass das Einfügen dieses Abschnitts in meine web.config für jeden Ansichtsordner das Problem gelöst hat.

<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>
Joseph Morgan
quelle
1
Ich habe tatsächlich festgestellt, dass die ROOT-Datei web.config aus irgendeinem Grund eine Bindungsumleitung hatte, die mein Problem verursachte (insbesondere 0.0.0.0-2.0.0.0auf 1.0.0.0), und die /View/web.configDatei überschreibt dies nicht. (Ich glaube auch nicht, dass Sie es in jedem brauchen /View/Subfolder/)
JoeBrockhaus
1

Dieser Fehler weist darauf hin, dass Sie die Rasiermaschine nicht ordnungsgemäß mit Ihrem Projekt verknüpft haben.

Lösung: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Webprojekt und wählen Sie "Nuget-Pakete verwalten ...". Installieren Sie dann "Microsoft ASP.NET Razor". Dadurch wird sichergestellt, dass das ordnungsgemäße Paket installiert ist, und die erforderlichen Einträge werden in die Datei web.config eingefügt.

user3459730
quelle
-6

Da ASP.NET MVC 3 RTM nicht verfügbar ist, ist für Razor kein Konfigurationsabschnitt erforderlich. Und diese Abschnitte können sicher entfernt werden.

nick4eva
quelle
Ich frage mich, ob das stimmt, nick4eva. Wenn ich eine neue MVC 3-Webanwendung erstelle und die Razor-Viewengine auswähle, enthält die Datei web.config, die im Ordner Views vorhanden ist, standardmäßig die Razor-Konfigurationsabschnitte. Wenn ich sie deaktiviere, werden zur Laufzeit Kompilierungsfehler angezeigt.
MichaelvR
3
MichaelvR, ja, das war mein Fehler. Es tut mir leid, dass Sie verwirrt eingetreten sind.
Nick4eva
Gilt dies auch für ein VB-basiertes MVC-Projekt? Ich habe keinen Zugriff auf meine Erweiterungsmethoden ... stackoverflow.com/questions/4789273/…
Ropstah
Diese Antwort ist falsch. Diese Konfigurationseinträge sind weiterhin erforderlich. Die neuen Projektvorlagen enthalten sie bereits. Wenn Sie jedoch eine Mvc 2-Anwendung aktualisieren, müssen Sie sie hinzufügen.
Marcind