2012-01-09 13 views
6

Problema:
Ho un markup come questo (solo le linee importanti):ASP/C# codice dietro non riesce a raggiungere il controllo di markup

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RTDeluxe.ascx.cs" 
Inherits="MainSolution.CONTROLTEMPLATES.Kunde.RTDeluxe" %> 
<ul id="linkUl" class="teaserLinksUL" runat="server"/> 

Il code-behind:

namespace MainSolution.CONTROLTEMPLATES.Kunde 
public partial class RTDeluxe : UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     linkUl.InnerHtml = string.Empty; 
    } 
} 

Posso accedere allo ul all'interno del code-behind e non ottenere alcun errore di compilazione. Ma quando eseguo il debug del codice ottengo un NullReferenceException perché linkUl è NULL.

Prima ho pensato che gli spazi dei nomi sono la ragione. Ma dopo diversi tentativi, sono sicuro che siano corretti. Il FileLocation sembra essere corretto e la cartella controltemplates del mio iis ha una cartella "Kunde" con i file ascx corrispondenti al suo interno.

Ho altri file .ascx con la stessa struttura -> funzionano come un incantesimo.

Domanda:
Ci sono altri motivi che lo spazio dei nomi per tale comportamento? Hai qualche suggerimento su dove posso guardare?

Edit:
Il file esiste RTDeluxe.ascx.designer.cs, generato linkUl assomiglia a questo:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl; 

Edit2:
Ok, cercherò di rispondere a tutte le vostre domande. Grazie per il tuo tempo e feedback!

  1. Ho riavviato Visual Studio -> Il problema persiste.
  2. Ho anche ripulito la soluzione e ne ho distribuita una nuova. -> Il problema persiste.
  3. Quando eseguo il debug e controllo la gerarchia di controllo, posso vedere che l'etichetta NON è lì.
  4. Quando cambio l'ID il compilatore genera un errore nel code-behind (che è giusto). Se cambio l'ID lì due ottengo lo stesso comportamento di prima.
  5. Ho riavviato anche il mio IIS e l'intero pc -> Nessuna modifica.
  6. Ho aggiunto un attributo Name alla definizione linkul -> Nessuna modifica.
  7. Quando provo a utilizzare FindControl restituisce NULL.
  8. Il framework di destinazione è .NET 3.5
  9. Il linkul NON è all'interno di un ripetitore o di altri controlli.
  10. La rimozione/modifica di web.config non porta nemmeno a una soluzione.
  11. L'aggiunta di EnsureChildControls prima di accedere a linkUl non modifica nulla.
  12. Anche lo spostamento del codice in Page_PreRender non funziona.

cercherò i vostri suggerimenti non elencati qui e aggiungerli al più presto.

Edit3:
Qui la piena markup:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> 
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RTDeluxe.ascx.cs" Inherits="MainSolution.CONTROLTEMPLATES.Kunde.RTDeluxe" %> 

<ul id="linkUl" class="teaserLinksUL" runat="server"/> 

* Edit4:
Ok qui alcune informazioni aggiuntive ho scoperto: Quando cambio qualcosa nel codice, come l'aggiunta di pianura testo HTML NON riconosciuto o mostrato nel browser. Quando faccio qualcosa di simile:

Label label1 = new Label(); 
    label1.Text = "hugo lives!"; 
    Controls.Add(label1); 

Viene mostrato. Sembra che in Visual Studio tutto vada bene ... Ma "live" sul server il code-behind parla con qualche strano markup diverso ...

+0

Puoi mostrare la definizione generata dal compilatore per linkUl? –

+0

hai il file RTDeluxe.designer.cs? – giammin

+0

@ giammin si, ho modificato la domanda. –

risposta

1

Questo potrebbe aiutare un po ':

Sul file code-behind degli utenti di controllo a livello di classe, aggiungere questo codice:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl = new System.Web.UI.HtmlControls.HtmlGenericControl(); 

e rimuovere il file protected global::System.Web.UI.HtmlControls.HtmlGenericControl linkUl; da RTDeluxe.ascx.designer.cs

Potrebbe essere perché il suo oggetto è stato appena dichiarato non creato. Spero che questo aiuti ..

0

Hai provato a chiamare EnsureChildControls prima di accedere al controllo o spostare il codice in OnPreRender?

+0

grazie per i suggerimenti :) ho provato entrambi, sfortunatamente non cambia il comportamento :( –

+0

Abbastanza sicuro che tutto ciò che assicura ConfirmChildControls è che il metodo CreateChildControls viene chiamato solo una volta. La pagina non lo sovrascrive per impostazione predefinita e Control ha un metodo astratto vuoto . –

0

Ho avuto un problema simile a questo prima in un file .aspx. È stato causato dall'ottimizzazione OptimCompilation impostata su true nel mio file web.config.

<system.web> 
    <compilation optimizeCompilations="true" /> 
</system.web> 

Quando optimizeCompilations è impostato su true ASP.Net ricostruisce solo le pagine quando ritiene necessario. A volte diventa confuso e non si rende conto che hai apportato una modifica che richiede una ricostruzione della pagina risultante in un errore di runtime che il compilatore non cattura. Vedi qui per maggiori informazioni su questa impostazione http://msdn.microsoft.com/en-us/library/ms366723.aspx.

Per risolvere il problema, ho dovuto impostare temporaneamente optimizeCompilations su false, ricreare il mio sito Web, riciclare il pool di app e quindi impostarlo nuovamente su true.

Spero che questo aiuti.

0

A volte in situazioni come questa può essere solo che Visual Studio si trova in uno stato negativo in relazione a questo file. Ho scoperto che eliminare i file e ricrearli risolve spesso il problema. Assicurati di copiare il codice da qualche parte in modo da poterlo incollare nuovamente nei file appena creati.

0

Si sta distribuendo utilizzando la funzionalità di pubblicazione di Visual Studio? In tal caso, provare a eliminare il file .ascx sul server di destinazione. Ho notato che lo studio visivo non riconosce che il file è stato modificato e quindi non copia il nuovo file.

Problemi correlati