wake-up-neo.com

Bei der Rasiermesseransicht werden referenzierte Assemblys nicht angezeigt

Ich versuche, eine stark typisierte Ansicht basierend auf einer Klasse aus einer anderen Assembly zu erstellen. Aus irgendeinem Grund scheint meine Rasiermesseransicht keine Sicht auf andere Baugruppen zu haben, auf die in meinem Projekt verwiesen wird. z.B.

@model MyClasses.MyModel

führt zu dem Fehler in Visual Studio 2010: "Der Typ- oder Namespace-Name MyClasses konnte nicht gefunden werden (fehlt eine using-Direktive oder eine Assemblyreferenz?)

Dieselbe Klasse, auf die in der Standard-View-Engine verwiesen wird, funktioniert einwandfrei. Ich habe das gleiche Problem, wenn ich versuche, die Klasse in meiner Ansicht zu referenzieren.

Verpasse ich etwas über Rasiermesser oder muss ich die Versammlung anders referenzieren?

92
techphoria414

Es gibt einen neuen Konfigurationsabschnitt, der zum Referenzieren von Namespaces für Razor-Ansichten verwendet wird.

Öffnen Sie die web.config-Datei in Ihrem Views-Ordner, und stellen Sie sicher, dass folgende Datei vorhanden ist:

<configuration>
    <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" />
                <add namespace="SquishIt.Framework" />
                <add namespace="Your.Namespace.Etc" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>
</configuration>

Alternativ können Sie Ihrem freigegebenen Layout using-Anweisungen hinzufügen:

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....

Starten Sie Visual Studio nach dem Bearbeiten der Web.config erneut, um die Änderungen anzuwenden.

101
quentin-starin

Ich hatte das gleiche Problem: MVC3 Project MyCore.Web verwies auf den MyCore.DBLayer-Namespace aus einem anderen Projekt in derselben Lösung (mit dem Assemblynamen MyCoreDBLayer). Alle Objekte aus MyCore.DBLayer funktionierten in Controllern und Modellen einwandfrei. In Razor-Ansichten schlug jedoch ein Fehler fehl. 'Der Typ- oder Namespace-Name' DBLayer 'ist im Namespace' MyCore 'nicht vorhanden (fehlt eine Assembly-Referenz?) was offensichtlich nicht der Fall war.

  • Die Option "Lokal kopieren" wurde auf "true" gesetzt. 
  • Das Hinzufügen von "using ..." -Anweisungen in Razor-Ansichten war sinnlos 
  • Das Hinzufügen von Namespaces zum Abschnitt system.web.webPages.razor war ebenfalls unbrauchbar

Das Hinzufügen von Assemblyreferenz zu system.web/compilation/assemblies der Root-Datei web.config behebte das Problem. Der Abschnitt sieht jetzt so aus:

<system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add Assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        **<add Assembly="MyCoreDBLayer" />**
      </assemblies>
    </compilation>
...
</system.web>

Das Auslassen von Version, Kultur und Token war vorerst in Ordnung, sollte aber in Zukunft behoben werden.

54
V.B.

In meinem Fall war das separate Projekt, das den Namespace enthielt, eine Konsolenanwendung. Durch das Ändern in eine Klassenbibliothek wurde das Problem behoben.

18
Sam

Keines der oben genannten Dinge funktionierte für mich.

  • Dlls wurden auf Local kopieren gesetzt
  • Das Hinzufügen von Namespaces zu beiden web.configs hat nichts bewirkt
  • Das Hinzufügen von Assemblyverweisen zu system.web\compilation\assemblies hat auch nicht geholfen (obwohl ich diese Referenzen nicht entfernt habe, so dass sie auch benötigt werden)

Aber ich habe endlich etwas gefunden, das für mich funktioniert hat:

Dies lag daran, dass meine Build-Ausgabe nach bin\Debug\für die Debug-Konfiguration und bin\Release\für Release-Konfigurationen ging. Sobald ich die Build-Konfiguration in "bin \" für alle Konfigurationen (wie in der Abbildung unten) geändert habe, funktionierte alles so, wie es sollte !!!

Build Configuration

Ich habe keine Ahnung, warum die Trennung der Builds in die Release- und Debug-Ordner dazu führen sollte, dass die Razor-Syntax bricht, aber es scheint, weil die Assemblys nicht gefunden wurden. Für mich sind die Projekte, die die Rasiermesser-Syntaxprobleme hatten, eigentlich meine 'Rasiermesser-Bibliothek'-Projekte. Sie sind als Anwendungsprojekte festgelegt, jedoch verwende ich sie als Klassenbibliotheken mit RazorGenerator, um meine Ansichten zu kompilieren. Als ich tatsächlich versuchte, eines dieser Projekte direkt auszuführen, hat es den folgenden Konfigurationsfehler verursacht:

Datei oder Assembly 'System.Web.Helpers, Version = 3.0.0.0, .__ konnte nicht geladen werden. Kultur = neutral, PublicKeyToken = 31bf3856ad364e35 'oder eines davon Abhängigkeiten. Die angegebene Datei wurde vom System nicht gefunden.

Dies führte mich zu dem Versuch, die Build-Ausgabe zu ändern, da ich feststelle, dass die Build-Ausgabe bei allen Webprojekten immer direkt im bin-Ordner abläuft, im Gegensatz zu den Standardeinstellungen für Klassenbibliotheken, die sowohl Release- als auch Debug-Ordner haben.

11
Sylvia

Sie scheinen nach dieser Antwort zu suchen: https://stackoverflow.com/a/4136773/176877

Öffnen Sie also das innere Views\Web.Config (NICHT das Stammverzeichnis) und fügen Sie den Namespace unter dem Tag "Pages" hinzu:

<system.web.webPages.razor>
  <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ...
      <add namespace="System.Web.Routing" />
      <!-- Your namespace here -->
    </namespaces>

Speichern Sie das, schließen Sie die Razor-Datei und öffnen Sie sie erneut.

Wenn Sie Bereiche verwenden, müssen Sie dies für jede Web.Config in jedem Bereich durchführen.

Visual Studio ist im Laufe der Jahre fehlerhafter geworden. Es kann daher erforderlich sein, die Razor-Datei zu schließen, einen Debug-Build auszuführen und die Razor-Datei erneut zu öffnen, oder im schlimmsten Fall einen Neustart von Visual Studio. Letztendlich wird Ihnen jedoch die Razor-Datei angezeigt, als ob alles in dieser Namespaces-Liste in @ using-Anweisungen oben in all Ihren Ansichten enthalten wäre.

6
Chris Moschini

Für mich bezog ich mich auf ein Projekt, das eine Konsolenanwendung war. Es wurde festgelegt, dass es als Exe (Konsolenanwendung) anstelle von Klassenbibliothek (DLL) erstellt wird. Als ich das änderte, konnte ich die Modelle aus diesem separaten Projekt problemlos erkennen. 

3
user1619480

In ASP.NET Core MVC besteht die Lösung darin, eine using in _ViewImports.cshtml hinzuzufügen, anstatt web.config im Ordner View zu platzieren, wenn Sie mit ASP.NET MVC 5 arbeiten.

_ViewImports.cshtml

@using mySolution
@using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Aussicht

@model LoginViewModel // Add to _ViewImports to make this line work
<div>This is the View for the login screen.</div>
2
radbyx

Ich habe einen ähnlichen Fehler erhalten, nachdem ich meine Entwicklungsmaschine von Win7 32bit auf Win7 64bit verschoben habe. Fehlermeldung: 

...\Web\Views\Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

Es stellte sich heraus, dass ich beide Versionen im GAC hatte. Die Ansicht web.config verwies auf v1, aber die App verwies auf v2. Die referenzierten Assemblys wurden entfernt und v1 wieder hinzugefügt. von System.Web.WebPages.Razor usw.

1
Tim

Ich habe dieselbe Fehlermeldung erhalten, als ich versuchte, Smo-Objekte in einer Rasiermesseransicht zu verwenden. Wahrscheinlich liegt das daran, dass Razor die im Projekt referenzierten DLLs nicht finden kann. Ich löste dies, indem "Lokal kopieren" auf "true" gesetzt wurde Bei allen Smo-DLLs kann es jedoch eine bessere Lösung geben (siehe den Link von Czechdude oben) @ using und web.config-Bearbeitungen sind nutzlos, da sie nur erforderlich sind, wenn Sie den Namespace-Teil von den Typnamen weglassen möchten (beispielsweise Server anstelle von Microsoft.SqlServer.Management.Smo.Server)

1
Zar Shardan

Ich hatte auch das gleiche Problem, aber das Problem war mit dem Target-Rahmen der Versammlung .

Die referenzierte Assembly befand sich in .NET Framework 4.6, wo das Projekt auf .NET Framework 4.5 festgelegt wurde.

Ich hoffe, dass dies jemandem helfen wird, der mit Frameworks verspielt hat.

1
Geeganage

nun, für mich war es anders. Ich habe die Assembly meines Konsolenanwendungsprojekts mit MVC-Projekt vermisst. Das Hinzufügen von Referenzen war also nicht genug. 

nun, das könnte jemand anderem helfen. Gehen Sie zur Root-Datei web.config system.web -> compilation -> und fügen Sie Ihre Projektreferenz wie folgt hinzu. 

<assemblies> <add Assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>

1
Jawand Singh

Versuchen Sie, den Namespace, in dem sich Ihre MyClasses befindet, der web.config unter hinzuzufügen 

<pages> <namespaces></namespaces> </pages>

0
amurra

umfassen den gesamten Namespace

@model namespace.myclasses.mymodel
0
Brettski

Ich habe nicht nur die Änderungen in web.config für <assemblies> und <namespaces> vorgenommen, sondern auch festgestellt, dass GAC die Assembly stark beeinflusst hat. Sie können das Token für Kultur und öffentliche Schlüssel wie jede andere .NET Assembly anwenden, die global registriert ist.

Einige schaudern bei der Erwähnung des GAC. Aber als Entwickler von BizTalk habe ich mich dazu durchgerungen.

0
Mark S

Nichts davon https://stackoverflow.com/a/7597360/808128 funktioniert für mich. Sogar "Hinzufügen von Assembly Referecene zum Abschnitt system.web/compilation/assemblies der Root-Datei web.config". Es gibt also zwei Möglichkeiten für mich: 1) Eine öffentliche Wrap-Klasse für meine Assembly hinzuzufügen, die der Razor-Code durch diese Wrap auf diese Assembly zugreifen kann; 2) Fügen Sie einfach Assembly-Logik zu einer öffentlichen Klasse in derselben Assembly hinzu, in der sich der Code des Rasiermessers befindet.

0
user808128

fügen Sie in Spacename-Modellen yourClassModel vor der Namensklasse public hinzu

public class yourClassModel{
    prop
}
0
Milad Jafari

Diese Lösung hat für mich funktioniert (Es ist lustig, aber funktioniert)

Ich habe die Ansichtsseiten bearbeitet und die Inhalte kopiert und darin eingefügt. Ich habe keinen Inhalt der Ansichten geändert, sondern nur so bearbeitet, dass das Visual Studio die Seiten nachverfolgen konnte, und danach begann alles zu funktionieren

Lösung - Bearbeiten Sie einfach die Seiten und ersetzen Sie sie durch dieselben Seiten (Für mich bearbeitet)

0
Arun Prasad E S

Der Name Ihres Projektordners muss identisch sein. Wenn sich der Projekt- oder Lösungsname unterscheidet, verletzt Sie MVC. 

Beispiel: Wenn Sie eine neue Anwendung erstellen und der Standardname Webapplicaiton1 zugewiesen wird, wird dieser Namespace erstellt. Nehmen wir also an, dass Sie diesen Namespace nicht haben möchten. Von VS aus ändern Sie überall, wo Sie "MyNamespace" sehen können. Sie suchen und ersetzen den gesamten Code aus "Webapplication1" und ersetzen ihn durch "MyNamespace". Dies ändert auch die Datei web.config, so dass sie entsteht

Jetzt wird alles funktionieren, außer Rasiermesseransichten. 

RazorViews kann es nicht finden, weil es eine seltsame Abhängigkeit von dem FOLDERNAME des Projekts gibt. Es ist ein schreckliches Design. 

Ich habe dies gründlich getestet, indem ich meine Dateien in eine neue Lösung kopiert habe, und der einzige Unterschied ist der Ordnername.

0
Jens Tand