2011-08-15 10 views
17

sto ottenendo l'errore sotto quando si cerca di costruire il progetto sito web in Visual Studio 2010:errore di ASP.NET: La pagina Y.ascx non può usare il controllo utente X.ascx

La pagina '/ WebSite /controls/C2.ascx 'non può usare il controllo utente' /WebSite/controls/C1.ascx ', perché è registrato in web.config e risiede nella stessa directory della pagina.

Ho 2 controlli utente web:

controls/C1.ascx 
controls/C2.ascx 

I controlli sono stati registrati nel web.config:

<configuration> 
    <system.web> 
     <pages> 
      <controls> 
       <add src="~/controls/C1.ascx" tagPrefix="my" tagName="C1"/> 
       <add src="~/controls/C2.ascx" tagPrefix="my" tagName="C2"/> 
      </controls> 
     </pages> 
    </system.web> 
</configuration> 

C1.ascx contiene solo un HTML statico, C2.ascx sta provando per includere C1:

C1.ascx contiene solo un semplice codice HTML statico semplice. C2.ascx sta cercando di includere C1.ascx:

<%@ Control Language="VB" %> 
<my:C1 runat="server" /> 
<p>Hello from C2</p> 

Quando si cerca di costruire il progetto, sto ottenendo il messaggio di errore nella parte superiore. Mi rendo conto che questo problema può essere risolto con l'aggiunta di un'altra direttiva Registra per C2.ascx ...:

<%@ Register Src="~/controls/C1.ascx" TagPrefix="ctl" TagName="C1" %> 

... ma mi chiedo se c'è una soluzione più pulita e perché sto ottenendo l'errore nel primo posto?

Grazie!

+0

possibile duplicato di [Usa controllo utente nella stessa cartella della pagina] (http://stackoverflow.com/questions/2964337/use-user-control-in-the-same-folder-as-the-page) – M4N

+0

C'è una ragione per cui <% @ Register ...%> è considerato "impuro"? Sembra diverso dall'aver usato le istruzioni nella parte superiore di un file .cs. – mikemanne

+0

È considerato solo non pulito quando il controllo è già registrato in web.config per ogni pagina o controllo utente Web, che è il mio caso. – michalstanko

risposta

25

Le uniche soluzioni possibili sono:

  • Spostare il controllo di fuori della directory propria attualmente condivisione con outer.ascx, o
  • Registrare nuovamente il controllo interno della outer.ascx come voi già citato
  • li ri-scrittura in codice come controlli in una libreria separata

personalmente ritengo in movimento è il più facile, se funzionerà per le vostre soluzioni. In secondo luogo sarebbe la ri-registrazione, anche se fastidioso. Probabilmente non vale la pena estenderli a una libreria completa di codice se questa è l'unica ragione per cui lo stai facendo.

+4

La ri-registrazione è l'opzione migliore per me, non voglio spostare i controlli utente in un'altra sottocartella solo perché ASP.NET agisce stranamente a volte. Grazie. – michalstanko

+3

Che errore stupido. Anche la registrazione per me funziona. – TheGateKeeper

5

È inoltre possibile inserire i controlli in cartelle diverse. Ma non penso che sia molto più pulito o migliore.

BTW: questo comportamento è di progettazione, come si può leggere on this MSDN page (cercare la nota gialla quasi alla fine della pagina).