2010-04-07 4 views
2

Normalement, nous utilisons tous using System.Linq; et using System.Data.Linq; par exemple sur le code-behind et attendons que nous pouvons atteindre les membres de ces espaces de noms du code source comme <%= Something.First()%> mais quand je l'ai écrit, asp.net a dit qu'il ne pouvait pas trouver First() dans le contexte et je devais ajouter <%@ Import Namespace="System.Linq" qui avait l'air très bizarre mais ça a marché. Étant donné qu'ils ciblent la même classe, ils ont tous deux besoin d'importer des espaces de noms distincts.Namespace Problème

code-behind:

using System; 
using System.Data.Linq; 
using System.Linq; 
using System.Text 

namespace Something 
{ 
    class Items : System.Web.UI 
    { 
     //... 
    } 

} 

mais aussi je dois ajouter le même espace de noms Linq sur la Html Source partie

<%@Import Namespace="System.Linq"%> 

Est-ce que je sais quelque chose de mal ou c'est un peu genre de bug dans asp.net. Je pensais que lorsque la page est en train de compiler, asp.net combine ces deux classes et convertit le code source html en classe cs et indique le contrôle dans la hiérarchie Control c= new Control();.

Merci d'avance.

Ps: Je suis en train d'atteindre par exemple First() dans Items.aspx et tout ce que je disais au sujet d'une page asp.net qui est Items.aspx

+0

Voulez-vous dire que First() est une méthode définie sur la classe Items derrière cette page? –

+0

Je veux dire que c'est une méthode d'extension de System.Linq mais je ne peux pas l'atteindre parce que j'ai dû le déclarer sur le code source html pour voir les membres. L'importer sur le code-behind ne semble pas fonctionner pour la partie source. – Tarik

+0

Correct. Ils sont compilés séparément. Voir mon commentaire ci-dessous. –

Répondre

3

Vous devez spécifier vos espaces de noms dans les deux endroits. C'est un comportement normal. Cela est nécessaire au compilateur pour pré-compiler séparément la page aspx et la page code-behind, avant de les fusionner en une classe et de faire la compilation proprement dite.

Par défaut, quelques espaces de noms communs sont déjà inclus dans la page aspx, vous n'avez donc pas besoin de les importer. Mais dans votre cas, vous devez importer Linq. Et comme l'a dit Joel Coehoorn, vous pouvez ajouter à cette liste d'espaces de noms par défaut dans Web.config, si vous ne voulez pas les ajouter manuellement dans les pages aspx.

0

First est pas une méthode de la classe, mais une méthode d'extension défini dans l'espace de noms System.Linq. Même si vous pouvez également utiliser cette méthode d'extension dans le code derrière, cela ne signifie pas que le compilateur ASP.NET peut trouver la méthode d'extension sans indice, d'où la directive <%@ Imports ... %>.

Notez que la compilation ASP.NET (c'est-à-dire de l'aspx) est distincte de la compilation du code derrière. Ce dernier s'exécute lorsque vous construisez le projet; le premier s'exécute lorsque vous accédez à la page pour la première fois, ou précompilez-le en utilisant "Publier ..." ou un projet de déploiement Web. Par conséquent chaque compilateur doit être dit où trouver cette méthode d'extension si vous l'utilisez dans les deux endroits.

+0

Oui, c'est la page Items.aspx. – Tarik

+0

S'il vous plaît expliquer? Qu'est-ce que c'est exactement "Quelque chose" alors? –

+0

Pouvez-vous s'il vous plaît expliquer la compilation de la page? J'ai compris que le code-behind sera compilé pendant la compilation. Mais vous dites que la page sera compilée à la demande du premier utilisateur, mais après cela, elle restera toujours compilée ou lorsque d'autres utilisateurs demanderont la même page plus tard, la compilera-t-elle à nouveau? Les copies compilées vivent-elles pour toujours ou sont-elles temporaires? Merci. – Tarik

3

Vérifiez votre fichier web.config pour une section namespaces et assurez-vous que System.Linq y est répertorié.

Documentation:
http://msdn.microsoft.com/en-us/library/ms164642.aspx

+0

Ceci évite d'avoir à le faire au niveau de la page, mais n'explique pas le problème à l'OP. –

+0

Donc pour les méthodes reach ou d'autres membres de l'espace de noms sur le code source comme le code spaghetti, j'ai dû déclarer les espaces de noms sur le code source ainsi que le code-behind? – Tarik

+2

Oui, il existe deux étapes de compilation distinctes. Le code derrière compile lorsque vous construisez votre projet; l'aspx se compile lors de la première consultation de la page ou lorsque vous pré-compilez votre site en utilisant "Publier ..." ou un projet de déploiement Web. –

0

Je ne voudrais pas utiliser First dans le balisage, si vous voulez continuer à le faire, faire un wrapper dans votre code derrière, comme SomeMethod ou SomeProperty et y accéder à partir du marquage comme <%=SomeProperty %>