2011-02-10 10 views
83

Sto tentando di creare una vista fortemente tipizzata basata su una classe da un altro assembly. Per qualsiasi motivo, tuttavia, la mia vista Razor non sembra avere alcuna visibilità di altri assembly referenziati sul mio progetto. per esempio.Visualizzazione basata su rasoio non vede gruppi di riferimento

@model MyClasses.MyModel 

genera l'errore in Visual Studio 2010, "Il tipo o dello spazio dei nomi nome MyClasses non è stato trovato (le manca un un riferimento all'assembly direttiva using o?)."

La stessa classe a cui si fa riferimento nel motore di visualizzazione standard funziona correttamente. Ho lo stesso problema nel cercare di fare riferimento alla classe nel mio corpo.

Mi manca qualcosa di Rasoio o devo fare riferimento all'assemblea in un altro modo?

+0

Si sta utilizzando l'intero spazio dei nomi? @model namespace.myclasses.mymodel, forse? – Brettski

risposta

92

C'è una nuova sezione di configurazione che viene utilizzata per fare riferimento agli spazi dei nomi per le viste del rasoio.

Aprire il file web.config nella cartella Views, e assicurarsi che ha il seguente:

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

In alternativa, è possibile aggiungere utilizzando le istruzioni per il layout comune:

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

Dopo aver modificato il Web.config, riavviare Visual Studio per applicare le modifiche.

+16

Funziona, tuttavia assicurati che gli assembly siano referenziati con 'Copy Local = true'. Gli assemblaggi esterni potrebbero non funzionare diversamente. – Terry

+1

Si noti che se si utilizzano viste da una sorgente "virtuale" (come il DB) invece di utilizzare file di visualizzazione reali, è necessario inserirli nel file web.config di ROOT affinché il codice nelle viste funzioni . – NightOwl888

+2

@Terry, sembra che Copy local = true sia necessario anche per alcuni assembly di namespace root di System. –

0

Prova ad aggiungere lo spazio dei nomi tuo MyClasses è al web.config sotto

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

0

comprendono l'intero spazio dei nomi

@model namespace.myclasses.mymodel 
1

mi è stato sempre lo stesso errore durante il tentativo di utilizzare gli oggetti Smo in una vista da rasoio. Apparentemente questo perché Razor non riesce a trovare le DLL a cui fa riferimento nel progetto. Ho risolto questo problema impostando "Copia locale" su true per tutte le DLL meno recenti, tuttavia potrebbe esserci una soluzione migliore (vedere il link di Czechdude sopra) Le modifiche @using e web.config sono inutili perché sono necessarie solo se si desidera omettere la parte dello spazio dei nomi dai nomi dei tipi (ad esempio Server invece di Microsoft.SqlServer.Management.Smo.Server)

52

Ho avuto lo stesso problema: Progetto MVC3 MyCore.Web faceva riferimento allo spazio dei nomi MyCore.DBLayer da un altro progetto nel stessa soluzione (con nome assembly MyCoreDBLayer). Tutti gli oggetti di MyCore.DBLayer hanno funzionato perfettamente in Controller e modelli ma non sono riusciti nelle visualizzazioni del rasoio con un errore "Il tipo o il nome dello spazio dei nomi 'DBLayer' non esiste nello spazio dei nomi 'MyCore' (manca un riferimento all'assembly?) ' che ovviamente non era il caso.

  • L'opzione Copia locale è stata impostata su true.
  • Aggiunta "usando ..." dichiarazioni in vista Razor era inutile
  • Aggiunta namespace di sezione system.web.webPages.razor era inutile così

Aggiunta assemblaggio referecene a system.web/compilazione/la sezione degli assembly del file web.config di root ha risolto il problema.La sezione ora assomiglia:

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

omettendo versione, la cultura, Token andava bene per ora, ma devono essere fissati in futuro.

+0

Questa soluzione funziona ma è una cattiva idea. Quando ho reso tutte le mie classi interne e ho reso l'assemblea Web un amico di MyCoreDBLayer, ha smesso di funzionare. Ho finito per scrivere una lezione pubblica come un modello MVC che avvolge le mie classi da gruppi di amici. Credo che non si dovrebbero usare classi diverse dal namespace dei modelli MVC nelle visualizzazioni Razor - è sempre possibile scrivere un wrapper –

+0

+1 - GRAZIE - questo mi stava facendo impazzire !! –

+0

Questo ha funzionato per me, ho provato ad aggiungerlo a 'Views/web.config' e ha funzionato quando è stato inserito anche lì. – guanome

0

Nessuno di questi https://stackoverflow.com/a/7597360/808128 funziona per me. Anche "aggiungendo assembly referecene alla sezione system.web/compilation/assembly del file web.config di root". Quindi i due modi rimangono per me: 1) aggiungere una classe di wrap pubblico per il mio assembly che il codice Razor possa accedere a questo assembly attraverso questo wrap; 2) basta aggiungere la logica di assemblaggio a una classe pubblica nello stesso assembly in cui si trova il codice del rasoio.

4

Lei sembra essere alla ricerca di questa risposta: https://stackoverflow.com/a/4136773/176877

Cioè, aprire le Visualizzazioni interni \ web.config (non quella di root), e aggiungere lo spazio dei nomi sotto il tag Pagine:

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

Salvare, quindi chiudere e riaprire il file Razor.

Se si utilizzano aree, è necessario eseguire questa operazione per ogni Web.Config in ciascuna area.

Visual Studio ha ottenuto buggier nel corso degli anni, quindi potrebbe richiedere la chiusura del file Razor che esegue un build di Debug, quindi riapertura del file Razor o, nel peggiore dei casi, il riavvio di Visual Studio. Ma alla fine presenterà il file Razor come se tutto ciò che si trova nell'elenco dei namespace fosse in istruzioni @using nella parte superiore di tutte le visualizzazioni.

1

Stavo ottenendo un errore simile dopo aver spostato la mia macchina di sviluppo da Win7 32 bit a Win7 64 bit. Messaggio di errore:

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

venuto fuori ho avuto entrambe le versioni del GAC. La vista web.config fa riferimento alla v1 ma l'app faceva riferimento alla v2. Rimosso gli assembly referenziati e aggiunto nuovamente v1. di System.Web.WebPages.Razor, ecc.

+0

+1 thx questo era il mio punto finale, ora posso eseguire il debug di asp.net mvc 4 hohoho! – citykid

10

Nessuno dei precedenti ha funzionato neanche per me;

  • DLL sono stati fissati per copia locale
  • Aggiunta di spazi dei nomi di entrambi i web.configs non ha fatto nulla
  • Aggiunta di riferimenti di assemblaggio a system.web \ compilazione \ assemblee anche non ha aiutato (anche se non ho rimosso questi riferimenti , quindi potrebbe essere che sono necessari anche)

Ma ho finalmente trovato qualcosa che ha funzionato per me:

E 'stato perché ho avuto la mia uscita di costruzione andando a bin \ Deb ug \ per le configurazioni di debug e bin \ Release \ for Release. Non appena ho cambiato la configurazione di Build in "bin \" per tutte le configu gazioni (come per l'immagine qui sotto) allora tutto ha iniziato a funzionare come dovrebbe !!!

Build Configuration

io ho idea del perché separando il tuo costruisce in uscita e di debug cartelle dovrebbe causare sintassi Razor per rompere, ma sembra essere perché qualcosa non riusciva a trovare le assemblee. Per me i progetti che stavano avendo problemi con la sintassi del rasoio sono in realtà i miei progetti di "biblioteca del rasoio". Sono impostati come progetti applicativi, tuttavia li uso come librerie di classi con RazorGenerator per compilare le mie viste.Quando ho davvero cercato di eseguire uno di questi progetti direttamente ha causato il seguente errore di configurazione:

Could not load file or assembly 'System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Questo mi ha portato a cercare di cambiare l'uscita Genera, come ho notato che per tutti i progetti web l'output di generazione sembra sempre essere direttamente nella cartella bin, diversamente dal default per le librerie di classi, che hanno sia le cartelle di rilascio che quelle di debug.

+0

Hanno confermato dal modo in cui non è necessario avere la sezione system.web \ compilation \ assemblies una volta che le DLL si trovano direttamente nella cartella bin. Questo può tornare ad essere solo

+0

Holy cow! Dopo molto tempo alla ricerca di una soluzione, questo ha finalmente risolto le mie visualizzazioni Razor in un progetto di libreria di classi !! Grazie mille. – Hullah

+1

Incredibile! Stavo costruendo la mia libreria di visualizzazioni di classe nella directory di un altro progetto e avevo questo problema. Il percorso di generazione deve essere bin \ affinché funzioni. Adesso usa invece post build xcopy. – GlacialSpoon

0

Oltre a apportare le modifiche di web.config per <assemblies> e <namespaces>, ho riscontrato che GACing l'assembly ha fatto una grande differenza. È possibile applicare il token di chiave pubblica e cultura come qualsiasi assembly .NET di base registrato a livello globale.

Alcuni possono rabbrividire alla menzione del GAC. Ma come sviluppatore BizTalk sono cresciuto per abbracciarlo.

17

Nel mio caso, il progetto separato che conteneva lo spazio dei nomi era un'applicazione console. La modifica in una libreria di classi ha risolto il problema.

+1

Questo l'ha risolto per me. Per prima cosa ho provato a creare una libreria di classi (pacchetto), ma ho incontrato problemi relativi a un pacchetto di nuget di cui avevo bisogno. La cosa migliore non è di fantasia e basta creare una libreria di base (DLL) – redwards510

0

nei modelli nomespazio, yourClassModel, aggiungere pubblico prima classe nome

public class yourClassModel { prop }

0

Questa soluzione ha funzionato per me (E 'divertente, ma funziona)

ho modificato il visualizzare le pagine e copiarne il contenuto e incollarlo, non ho modificato alcun contenuto delle viste, ma appena modificato in modo che lo studio visivo potesse fare la cosa per rintracciare le pagine, dopodiché ogni cosa ha iniziato a funzionare

Solution - Basta modificare le pagine e sostituire con le stesse pagine (ha lavorato per me)

2

In ASP.NET MVC Nucleo la soluzione è quella di aggiungere un using in _ViewImports.cshtml, invece di metterlo web.config nella cartella di vista quando si lavora con ASP.NET MVC 5.

_ViewImports.cshtml

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

View

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

beh, per me era diverso. Mi mancava l'assemblaggio del mio progetto di applicazione per console con il progetto MVC. Quindi, aggiungere un riferimento non era abbastanza.

bene questo potrebbe aiutare qualcun altro. vai al file root web.config system.web ->compilation -> aggiungi il tuo riferimento al progetto in questo modo.

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

1

Ho anche avuto lo stesso problema, ma il problema era con il framework di destinazione del gruppo.

L'assembly di riferimento era in .NET Framework 4.6 in cui il progetto è stato impostato su .NET framework 4.5.

Spero che questo possa aiutare qualcuno che ha incasinato le strutture.

0

Il nome del tuo progetto FOLDER deve essere lo stesso. Se il nome del progetto o della soluzione è diverso, MVC ti farà male.

Esempio: se si crea una nuova applicazione e si ottiene il nome predefinito Webapplicaiton1, questo spazio dei nomi verrà creato. Quindi, diciamo che non vuoi avere questo spazio dei nomi, quindi dal VS puoi cambiare ovunque puoi vedere in "MyNamespace". Cerca e sostituisci tutto il codice da "Webapplication1" e sostituiscilo con "MyNamespace". Questo cambia anche file web.config, in modo che inculdes

Ora tutto funziona, tranne vista rasoio.

RazorViews non riesce a trovarlo, perché esiste una sorta di strana dipendenza dal FOLDERNAME del progetto. È un design terribile.

Ho provato questo semi-completamente copiando i miei file in una nuova soluzione, e l'unica differenza è il nomecomputer.

Problemi correlati