9

Ho la seguente definizione nella parte superiore del mio file .ASCX:Visual Studio 2008 perde intellisense per ASCX con CodeBehind (ma funziona per CodeFile)?

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %> 

In quel controllo faccio uso di <% =%> blocchi per riferirsi ai membri che ho dichiarato nel code-behind file. Se compilo e distribuisco il controllo, funziona correttamente. Ma in Visual Studio ho un sacco di errori in fase di progettazione, "{alcune variabili} non esistono nel contesto attuale." E anche Intellisense si rompe: funziona per i membri di UserControl, ma non riesce a trovare i miei membri dichiarati. Ci sono anche altri problemi. In generale, tutto fa riferimento al fatto che la classe ASP.articleview_ascx che viene generata non eredita in qualche modo dalla classe MyNameSpace.ArticleView.

Ho scoperto che se passo l'attributo CodeBehind a "CodeFile":

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %> 

improvvisamente funziona Intellisense e tutti gli errori in fase di progettazione scomparire. Ma non voglio fare la compilazione runtime, o distribuire i miei file .ASCX.CS - quindi non posso usare CodeFile.

Ho controllato le cose semplici, come verificare che il mio nome file CodeBehind sia corretto & la classe Inherits ha lo spazio dei nomi corretto, ecc. (E poiché funziona correttamente dopo aver cambiato l'attributo in CodeFile, questi devono puntare a il posto giusto ....) Ma cosa mi manca? Perché non può gestire l'attributo CodeBehind?

Grazie,
Steve


Aggiornamento: da un thread qui sotto - questione di fondo è stato, perché non basta usare CodeFile? Risposta: quando si tenta di distribuire utilizzando CodeFile = nei miei file, dopo la distribuzione ricevo il seguente stack trace (presentata nella sua interezza):

/_layouts/Pages/ViewPage.aspx.cs' non esiste. su System.Web.UI.Util.CheckVirtualFileExists (VirtualPath virtualPath) su System.Web.UI.TemplateParser.ProcessCodeFile (VirtualPath codeFileVirtualPath) su System.Web.UI.TemplateParser.ProcessMainDirectiveAttribute (String deviceName, String name, String value, IDictionary parseData)

(Questo è da una richiesta di /_layouts/Pages/ViewPage.aspx. ViewPage è la pagina che ha diversi altri controlli tra cui la dettagliata degli articoli di cui al mio esempio originale. succede solo per essere il primo file che fallisce - se torno a CodeBehind = in ViewPage, quindi ASCX incluso con CodeFile = fallirà nello stesso modo.) Questo sembra essere il compilatore di pagine che si lamenta perché la classe codebehind ereditata non può essere trovata in nessuna DLL caricata, quindi si aspetta che ci debba essere un file CS per effettuare la compilazione su richiesta.

Il problema qui è che non voglio distribuire file CS, solo ASPX/ASCX. Dopo aver letto molti articoli come this great one, sono a conoscenza dei vari nuovi modelli di implementazione, sebbene non abbia mai usato altro che un progetto di applicazione Web (convertito in avanti da VS2003, siamo stati in ritardo nell'adozione del 2005 & il modello WAP era già stato aggiunto al momento in cui siamo passati dal 2003.) In molti progetti VS2005/8, non ho mai avuto un problema con CodeBehind =, fino a quando questo problema Intellisense non si è verificato ... anche se non aiuta in questo caso, io ' m la distribuzione in SharePoint, che introduce un nuovo livello di complessità.

Poiché non ho distribuito utilizzando CodeFile in precedenza, è molto probabile che manchi qualche opzione che dovrei impostare in VS al momento della compilazione, al fine di forzare una pre-compilazione.Devo solo essere in grado di distribuire, come faccio oggi, come un set di ASPX/ASCX con un singolo codebehind DLL. E questo funziona oggi con CodeBehind = ... ha solo il problema Intellisense, che è quello che voglio risolvere :)

Pubblicherò più mentre identifico quali file potrebbero essere rilevanti per la domanda ...

+0

Avere hai selezionato la Build Action sui file ? –

risposta

5

hai controllato l'azione Genera i file di progetto? Ho duplicato il problema impostando l'azione di compilazione su ArticleView.ascx.designer.cs su Nessuno. Posso anche compilare quando uso CodeFile, ecc ..., sono sicuro al 99% che è il tuo problema.

+0

Wow, era così. Altri erano molto vicini alla causa - i file designer.cs non potevano essere sincronizzati in qualche modo - ma questo era il motivo esatto. Non so come sia andata in questo modo, ma i file dei designer per tutte le classi che avevo creato nelle ultime due settimane erano impostati su Build = None. Posso capire perché CodeFile avrebbe risolto questo problema, ma non ho ancora capito perché il progetto, quando implementato, stava funzionando del tutto :) Immagino che i file del designer siano stati generati su richiesta? Oh bene –

+1

È difficile da duplicare perché non è possibile costruire in questo modo, ma la pagina verrà caricata e sì, ASP.NET sta creando la dichiarazione che manca quando la pagina viene caricata. Questa è la pipeline ASP.NET in azione.Lavorare su Sharepoint probabilmente lo ha reso meno evidente come causa perché il debug e la distribuzione sono così ... diversi per dirla gentilmente. –

+0

Grazie per la ricompensa di generosità. :) –

3

CodeBehind è obsoleto in .NET 2.0. Credo che solo < = 1.1 usi "CodeBehind". Ora è "CodeFile" come dici tu.

Perché non vuoi compilare il tuo codice? Se si compila non è necessario distribuire i file .cs ...

+0

Mi permetta di chiarire: per quanto ho capito, CodeBehind è ancora supportato, ma CodeFile è preferito. In ogni caso, compiliamo il nostro codice, ed è per questo che voglio usare CodeBehind piuttosto che CodeFile, il che sembra richiedere la distribuzione di .ascx.cs e del file .ascx. Tutto ciò che distribuiamo ora (e tutto ciò che vogliamo continuare a distribuire) è il file .ascx, con le informazioni codebehind provenienti da 1 Assemblea condivisa. Sto fraintendendo CodeFile? –

+0

hai testato la distribuzione senza i tuoi file .cs? se stai eseguendo un progetto compilato non devi mai distribuire i tuoi file di codice, solo il tuo .aspx. Correggere, ricostruire, ridistribuire, fatto. – Jason

+0

Grazie, Jason. L'ho testato brevemente e l'ambiente (un sito di Sharepoint) ha segnalato che la pagina non poteva essere caricata perché mancava il file CS. Ma potrei semplicemente mancare una sorta di opzione di compilazione, quindi esaminerò ciò! Quello che hai descritto è esattamente ciò che voglio fare ... e farlo con CodeFile, se possibile, è grandioso. –

4

Questo è successo a me prima. Prova a fare clic destro su ascx/aspx e fare clic su "Converti in applicazione Web". Potresti semplicemente perdere i controlli generati. Se non lo vedi nel menu di scelta rapida, elimina prima il file generato dal designer.

4

Manca il file [your-file] .ascx.designer.cs, che collega i controlli al codebehind.

Proprio come i suggerimenti CitizenBane, è necessario fare clic con il pulsante destro del mouse sul file (o sulle cartelle o sull'intero progetto Web) e selezionare "Converti in applicazione". Visual Studio esaminerà i file ascx/aspx per i controlli server e genererà il file di progettazione per te.

Io in realtà sono imbattuto in questo io stesso, su una scala molto più grande ... C#: How to convert a Website project to a Web Project

Controllare la risposta.

+1

+1 per spiegarlo meglio di me! – CitizenBane

+0

Heh. E io sono quello che ha votato la tua risposta – eduncan911

+0

Grazie - questa è una spiegazione comune sul web ("Convert to Web Application") ma l'ho trovato e non è stato risolto. e i riferimenti ai controlli denominati nel file ASCX funzionano dal file .ASPX.CS. Tuttavia, penso che tu stia facendo qualcosa, e il mio progetto non è probabilmente "ben formato". Jason ha anche sospettato qualcosa di simile .. Sto esaminando per vedere se riesco a ricreare i file o capire cosa non è collegato correttamente! –

2

Perché hai il codice dietro per il tuo controllo ascx come un codice di pagina con aspx dietro? un UserControl (ascx) di solito ha un codebehind di

CodeBehind="ArticleView.ascx.cs" 

invece di quello che hai elencato

CodeBehind="ArticleView.aspx.cs" 

Avviso del aspx al posto del ascx per un controllo utente.

Questo potrebbe essere il tuo problema ... un semplice errore di battitura o un errore di copia e incolla. possibilità Coppia vengono in mente:

  1. Forse avete il controllo ascx (User Control) sopra specificato utilizzando un codice al file che viene eredita da System.Web.UI.Page invece di System.Web.UI.UserControl (potrebbe causare gli errori di Visual Studio).
  2. Si ha l'UserControl puntato sul codice retrostante per la stessa pagina aspx. Problema simile al numero 1 che causerebbe la confusione di Visual Studio.
  3. I file sono nome ArticleView.ascx e ArticleView.aspx.cs. Ciò potrebbe confondere Visual Studio poiché credo che VS potrebbe aspettarsi una particolare convenzione di denominazione.

per un controllo utente (ascx) i file devono essere denominati:

  • ArticleView.ascx (CodeBehind = "ArticleView.ascx.cs" Inherits = "[NAMESPACE] .ArticleView")
  • ArticleView.ascx.cs (ereditato da System.Web.UI.UserControl)
  • ArticleView.ascx.designer.cs

Per un Web Da (aspx) i file deve essere denominato:

  • ArticlePage.aspx (CodeBehind = "ArticlePage.aspx.cs" Inherits = "[NAMESPACE] .ArticlePage")
  • ArticlePage.aspx.cs (eredita da System.Web.UI.Page)
  • ArticlePage.aspx.designer.cs
+0

+1 per l'occhio buono, ma potrebbe essere un errore di battitura e nemmeno il nome del controllo reale ecc .... –

+0

Grazie, hai perfettamente ragione sull'errore di battitura ... ma è un errore di battitura che è successo mentre stavo preparando un caso di esempio più piccolo da pubblicare su Stack Overflow. Stavo cercando di pulire le cose e ho digitato accidentalmente "ASPX". I controlli e i moduli sono nominati come hai spiegato. Grande cattura però! –

1

Questo mi è appena successo in VS2010 dopo aver aggiornato un progetto di applicazione Web su .net 4.0.

La risposta è stata per assicurarsi di avere targetFramework = "4.0" impostato nella sezione system.web/compilation in web.config

cioè

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
</system.web> 
Problemi correlati