9

J'ai la définition suivante en haut de mon fichier .ascx:Visual Studio 2008 perdre intellisense pour ASCX avec CodeBehind (mais fonctionne pour CodeFile)?

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

Dans ce contrôle, je fais usage de <% =%> blocs pour désigner les membres que j'ai déclaré dans le code-behind fichier. Si je compile et déploie le contrôle, cela fonctionne très bien. Mais dans Visual Studio, je reçois beaucoup d'erreurs de conception, "{une variable} n'existe pas dans le contexte actuel." Et Intellisense se brise aussi: cela fonctionne pour les membres de UserControl, mais ne peut pas trouver mes propres membres déclarés. Il y a aussi d'autres problèmes. En général, tout indique que la classe ASP.articleview_ascx générée ne hérite pas de la classe MyNameSpace.ArticleView.

J'ai trouvé que si je passe l'attribut CodeBehind « CodeFile »:

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

soudainement IntelliSense fonctionne et toutes les erreurs en temps de conception disparais. Mais je ne veux pas faire de compilation d'exécution, ou déployer mes fichiers .ASCX.CS - donc je ne peux pas utiliser CodeFile.

J'ai vérifié les choses simples, comme m'assurer que mon nom de fichier CodeBehind est correct & la classe Inherits a l'espace de noms approprié, etc (Et puisque cela fonctionne correctement après avoir changé l'attribut en CodeFile, ceux-ci doivent pointer sur au bon endroit ....) Mais qu'est-ce qui me manque? Pourquoi ne peut-il pas gérer l'attribut CodeBehind?

Merci,
Steve


Mise à jour: à partir d'un fil ci-dessous - question de base a été, pourquoi ne pas simplement utiliser CodeFile? Réponse: lorsque je tente de déployer à l'aide CodeFile = dans mes fichiers, après le déploiement, je reçois la trace de pile suivante (présentée dans son intégralité):

/_layouts/Pages/ViewPage.aspx.cs' n'existe pas. à System.Web.UI.Util.CheckVirtualFileExists (VirtualPath virtualPath) à System.Web.UI.TemplateParser.ProcessCodeFile (VirtualPath codeFileVirtualPath) à System.Web.UI.TemplateParser.ProcessMainDirectiveAttribute (String deviceName, String name, String valeur, IDictionary parseData)

(Ceci est d'une demande de /_layouts/Pages/ViewPage.aspx. ViewPage est la page qui a plusieurs autres contrôles, y compris le ArticleView mentionné dans mon exemple original. Il se trouve être le premier fichier échoue - si je retourne à CodeBehind = dans ViewPage, alors ASCX avec CodeFile = échouera de la même manière.) Cela semble être le compilateur de la page qui se plaint parce que la classe héritée codebehind ne peut être trouvée dans aucune DLL chargée, il s'attend à ce qu'il y ait un fichier CS pour faire une compilation à la demande.

Le problème ici est que je ne veux pas déployer de fichiers CS, juste ASPX/ASCX. Ayant lu à travers de nombreux articles comme this great one je suis au courant des différents nouveaux modèles de déploiement, bien que je n'ai jamais utilisé autre chose qu'un projet d'application Web (converti à partir de VS2003, nous étions des adopteurs tardifs de 2005). Au fil des projets VS2005/8, je n'ai jamais eu de problème avec CodeBehind =, jusqu'à ce que ce problème d'Intellisense apparaisse ... même si ça ne m'aide pas dans ce cas. m déploiement sur SharePoint, ce qui introduit un tout nouveau niveau de complexité. Comme je n'ai pas encore déployé de CodeFile, il est très probable qu'il me manque une option que je suis supposé mettre dans VS lors de la construction, afin de forcer une précompilation.J'ai juste besoin d'être capable de déployer, comme je le fais aujourd'hui, comme un ensemble d'ASPX/ASCX avec une seule DLL codebehind. Et cela fonctionne aujourd'hui avec CodeBehind = ... il a juste le problème Intellisense mentionné à l'origine, qui est vraiment ce que je veux réparer :)

Publiera plus comme j'identifie quels fichiers pourraient être pertinents à la question ...

+0

Avez-vous vérifié l'Action Misez sur vos fichiers ? –

Répondre

5

Avez-vous vérifié l'action Misez sur vos fichiers de projet? J'ai dupliqué votre problème en définissant l'action de construction sur ArticleView.ascx.designer.cs sur Aucun. Je peux aussi compiler en utilisant CodeFile, etc ..., je suis sûr à 99% que c'est votre problème.

+0

Wow, c'était tout. D'autres étaient très proches de la cause - les fichiers designer.cs devaient être désynchronisés d'une manière ou d'une autre - mais c'était la raison exacte. Je ne sais pas comment cela s'est passé, mais les fichiers du concepteur pour toutes les classes que j'avais créées au cours des deux dernières semaines ont été définis sur Build = None. Je peux comprendre pourquoi CodeFile résoudrait cela mais je ne comprends pas encore pourquoi le projet, quand il était déployé, fonctionnait du tout :) Je suppose que les fichiers du concepteur étaient générés à la demande? Eh bien –

+1

Il est difficile de dupliquer parce que vous ne pouvez pas construire comme ça, mais la page va charger et oui, ASP.NET crée la déclaration qui manque quand la page est chargée. C'est le pipeline ASP.NET en action.Travailler sur Sharepoint a probablement rendu cela moins évident, car le débogage et le déploiement sont si différents ... pour le dire gentiment. –

+0

Merci pour la récompense de la prime. :) –

3

CodeBehind est obsolète dans .NET 2.0. Je crois que seulement < = 1.1 utilise "CodeBehind". Maintenant, c'est "CodeFile" comme vous dites.

Pourquoi ne voulez-vous pas compiler votre code? Si vous compilez, vous n'avez pas besoin de déployer vos fichiers .cs ...

+0

Permettez-moi de clarifier - pour autant que je sache, CodeBehind est toujours supporté, mais CodeFile est préféré. En tout cas, nous compilons notre code, et en fait c'est pourquoi je veux utiliser CodeBehind plutôt que CodeFile, ce qui semble me demander de déployer le fichier .ascx.cs ainsi que le fichier .ascx. Tout ce que nous déployons maintenant (et tout ce que nous voulons continuer à déployer) est le fichier .ascx, avec les informations codebehind provenant de 1 Assembly partagé. Suis-je en train de mal comprendre CodeFile? –

+0

avez-vous testé le déploiement sans vos fichiers .cs? Si vous exécutez un projet compilé, vous n'avez jamais à déployer vos fichiers de code, juste votre .aspx. Corriger, reconstruire, redéployer, fait. – Jason

+0

Merci, Jason. Je l'ai testé brièvement et l'environnement (un site Sharepoint) a signalé que la page ne pouvait pas charger car le fichier CS était manquant. Mais je pourrais juste manquer une sorte d'option de compilation, alors je vais regarder dans cela! Ce que vous avez décrit est exactement ce que je veux faire ... et le faire avec CodeFile si possible est génial. –

4

Cela m'est déjà arrivé. Essayez de faire un clic droit sur l'ascx/aspx et cliquez sur "Convert to Web Application". Vous pouvez juste manquer les contrôles générés. Si vous ne le voyez pas dans le menu contextuel, supprimez d'abord le fichier généré par le concepteur.

4

Il vous manque le fichier [votre-fichier] .ascx.designer.cs, qui lie vos contrôles à votre codebehind.

Tout comme les suggestions de CitizenBane, vous devez cliquer avec le bouton droit sur le fichier (ou les dossiers, ou le projet Web entier) et sélectionner «Convertir en application». Visual Studio examinera vos fichiers ascx/aspx pour les contrôles serveur et générera ce fichier de concepteur pour vous.

En fait, je couru dans moi-même, à une échelle beaucoup plus grande ... C#: How to convert a Website project to a Web Project

Vérifiez la réponse.

+1

+1 pour l'expliquer mieux que moi – CitizenBane

+0

Et je suis celui qui a voté votre réponse – eduncan911

+0

Merci - c'est une explication courante sur le web ("Convertir en Application Web") mais je l'avais trouvé et il ne l'a pas corrigé. et les références aux contrôles nommés dans le fichier ASCX fonctionnent à partir du fichier .ASPX.CS Cependant, je pense que vous êtes sur quelque chose, et mon projet n'est probablement pas "bien formé" Jason a également suspecté quelque chose de similaire .. Je cherche à voir si je peux recréer les fichiers ou comprendre ce qui n'est pas connecté correctement! –

2

Pourquoi avez-vous le code derrière pour votre contrôle ascx comme un code de page aspx derrière? A UserControl (ascx) a généralement un codebehind de

CodeBehind="ArticleView.ascx.cs" 

au lieu de ce que vous avez énumérés

CodeBehind="ArticleView.aspx.cs" 

Notez que le ASPX au lieu du ascx pour un contrôle utilisateur.

Cela pourrait être votre problème ... une simple faute de frappe ou une erreur de copier-coller. possibilités de couple viennent à l'esprit:

  1. Peut-être que vous avez le contrôle ascx (User Control) indiqué ci-dessus en utilisant un code derrière le fichier qui est héritant de System.Web.UI.Page au lieu de System.Web.UI.UserControl (cela peut provoquer les erreurs Visual Studio).
  2. Vous avez le UserControl pointé sur le code derrière pour une même page nom aspx. Problème similaire à # 1, ce qui entraînerait une confusion pour Visual Studio.
  3. Vos fichiers portent le nom ArticleView.ascx et ArticleView.aspx.cs. Cela peut perturber Visual Studio car je crois que VS peut s'attendre à une convention de nommage particulière.

Pour un contrôle utilisateur (ascx) vos fichiers doivent être nommés:

  • ArticleView.ascx (CodeBehind = "ArticleView.ascx.cs" Inherits = "[NAMESPACE] .ArticleView")
  • ArticleView.ascx.cs (hérite de System.Web.UI.UserControl)
  • ArticleView.ascx.designer.cs

Pour un Web à partir (ASPX) vos fichiers doit être nommé:

  • ArticlePage.aspx (CodeBehind = "ArticlePage.aspx.cs" Inherits = "[NAMESPACE] .ArticlePage")
  • ArticlePage.aspx.cs (hérite de System.Web.UI.Page)
  • ArticlePage.aspx.designer.cs
+0

+1 pour le bon oeil, mais il pourrait s'agir d'une faute de frappe et pas même le vrai nom du contrôle etc ... –

+0

Merci, vous avez totalement raison sur la faute de frappe ... mais c'est une faute de frappe qui s'est passé pendant que je me préparais un cas d'exemple plus petit à publier sur Stack Overflow. J'essayais de nettoyer les choses et tapé accidentellement "ASPX". Les contrôles et les formulaires sont nommés comme vous l'avez expliqué. Super attrape quand même! –

1

Cela m'est arrivé dans VS2010 après la mise à niveau d'un projet d'application Web vers .net 4.0.

La réponse est de vous assurer que vous avez targetFramework = "4.0" situé sur la section system.web/compilation dans web.config

-à-dire

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
</system.web> 
Questions connexes