2009-12-06 3 views
0

J'ai créé un nouveau projet de site Web. Certaines classes auxiliaires sont dans le dossier App_Code. Les pages sont dans la racine. Les contrôles utilisateur se trouvent dans le dossier UserControls à la racine. Toutes les classes de pages sont définies dans l'espace de noms MyProjectName.Pages. Toutes les classes de contrôle utilisateur sont définies dans l'espace de noms MyProjectName.UserControls.Impossible d'accéder à la classe de page à partir du contrôle

Je peux avoir accès à partir de mes pages aux commandes, mais je ne peux pas accéder à partir de mes contrôles aux classes de page! J'utilise la propriété Page et essaye de le convertir en classe MyPage (directive include en utilisant MyProjectName.Pages au début). Ici, le compilateur dit, il n'y a pas de type ou de pages d'espace de noms dans l'espace de noms MyProjectName. En outre, je ne vois pas ces espaces de noms (MyProjectName.Pages et MyProjectName.UserControls) dans Object Viewer. Devrais-je remplacer quelque part mes commandes et mes pages pour avoir la possibilité d'utiliser des classes de pages à partir de contrôles?

+0

Et comment puis-je voir tous les espaces de noms de mon projet de site Web? – Sevina

Répondre

1

Votre meilleur pari est de passer à Web Project à partir du site Web.

WebSite "projet" est un enfant de Microsoft introduit dans ASP.NET 2.0 avec l'intention de pouvoir compiler dynamiquement les pages APRES le déploiement du site. Par conséquent, le compilateur doit être préparé à la situation lorsque les pages sont modifiées (y compris l'introduction et/ou la suppression des espaces de noms) après sa construction. La solution de Microsoft à ce problème consistait à séparer les classes de l'app_Code des pages - elles sont compilées dans des passes séparées. Au début, c'était le seul modèle pour les applications Web dans ASP.NET 2.0, mais il a introduit tant de problèmes (le vôtre n'est que l'un d'eux) que MS a réintroduit le modèle à partir de ASP.NET 1.1 maintenant connu sous le nom de projets Web. Ce modèle n'a aucune de ces limitations, mais le déploiement dynamique d'apsx est plus difficile. En fin de compte, à moins que vous ayez vraiment besoin de pouvoir remplacer ASPX à la volée, il vaut mieux avoir un projet web. Et si vous avez à regarder de plus près la conception de votre site Web

+0

Merci pour l'explication détaillée! Pourriez-vous me dire, que dois-je faire pour passer à Web Project? Et devrais-je changer certains paramètres ou paramètres IIS dans web.config? – Sevina

+1

c'est un lien que j'ai trouvé sur MSDN: http://msdn.microsoft.com/en-us/library/aa983476%28VS.80%29.aspx – mfeingold

0

La raison de votre problème est liée à la façon dont les projets de site Web sont construits. Comme ils sont conçus pour être créés à la volée par IIS, ils ne regroupent pas tous les fichiers du projet en une seule DLL; les liens pris en charge sont limités. Le code commun doit être dans App_Code, pas dans vos classes de pages.

En outre, pourquoi essayez-vous d'accéder à vos classes de page à partir de vos contrôles? C'est inhabituel, et ne devrait normalement pas être nécessaire.

+0

J'ai migré! Merci beaucoup! .. Mais ne devrait pas contrôler l'utilisation de certaines propriétés, avec sont communs pour plusieurs contrôles et pages - tels que UserID - qui récupèrent de Cookie userID - ceci définissent sur le pge et utilise dans certains contrôles, ils doivent donc cast page class – Sevina

+0

Cependant, ce n'est pas une bonne idée de définir de telles propriétés sur la page elle-même. Cette approche est fragile et se casse facilement. Il existe de meilleurs moyens, c'est-à-dire que vous pouvez dériver votre propre classe de page à partir de la page Web.Page et y définir de telles propriétés. Vos pages peuvent dériver de la classe de votre page. – mfeingold

+0

@Sevina: vous pouvez transmettre des données de votre page à vos contrôles en utilisant les propriétés des contrôles. C'est beaucoup mieux que d'essayer de faire revenir le contrôle dans la page d'une façon ou d'une autre. Une autre possibilité consiste à définir des paramètres dans le cache par requête sur HttpContext.Items [], ou à utiliser des fonctions avec une portée au niveau du projet, plutôt que de placer ces fonctions dans vos pages. – RickNZ

Questions connexes