2009-05-21 7 views
5

J'ai un contrôle utilisateur qui contient asp: Literal.asp: contrôle littéral null dans le contrôle utilisateur

<div> 
    <asp:Literal id="MenuContainer" runat="server" /> 
</div> 

Il existe une méthode dans le code-behind initialisant le contrôle:

internal void Setup(MyBusinessObject obj) 
{ 
    MenuObject menu = MenuHelper.GetMenu(obj.State); 

    if(obj == null) 
     MenuContainer.Visible = false; 

    //other code 
} 

Dans la page où le contrôle est utilisé que j'appelle Setup méthode de contrôle dans LoadComplete gestionnaire d'événements (Je l'ai appelé pour la première fois en Charger l'événement). Quelle que soit MyBusinessObject étant nulle ou non nulle, quand j'accéder littérales sur le contrôle de l'utilisateur, j'obtiens l'erreur:

Object reference not set to an instance of an object. 

Quelle est la raison et quel est le remède pour cela?

+0

Cela fonctionne bien pour moi. Il peut y avoir un autre problème. Essayez de compiler l'ensemble du site Web. Et en passant, êtes-vous en mesure d'accéder aux autres contrôles dans ce contrôle correctement? – Kirtan

+0

En fait, c'est le seul contrôle dans l'utilisateur-contorl – TheVillageIdiot

Répondre

11

Il était très simple. J'ajoutais des choses dans la section des contrôles de web.config comme cela a été suggéré par Rick Sthral dans l'un de ses articles (:(pour avoir reçu le message, il faudra chercher sur sa page). contrôles sans mettre @ Enregistrer tag mais l'inconvénient était que les contrôles enfants sur mes contrôles ont été affichés comme nul!donc j'ai simplement mis @ Enregistrer directive dans mes pages et cela a fonctionné.

+0

+1, merci! Bien que quelqu'un peut expliquer cette solution absurde? Le raccourci web.config n'est-il pas censé supprimer le besoin de balayer le balisage de page avec les directives Register? Pourquoi même s'inquiéter si nous devons le mettre là de toute façon pour éviter d'étranges, les cheveux-tirant-dehors les erreurs comme ceci? Ok,. –

+0

@Yadyn c'est ce que je ne suis pas capable de comprendre. J'ai mis un commentaire sur le blog de Rick mais je n'ai pas de réponse. – TheVillageIdiot

0

Êtes-vous sûr que MenuContainer est le problème? Vous référencez obj.State dans la première ligne de la fonction Setup. Si ce obj est nul, vous obtiendrez cette erreur.

+0

Oui, c'est le problème. if (obj == null) passe. MenuContainer.Visible renvoie une exception. – TheVillageIdiot

0

Comme mentionné dans la réponse par JerSchneid, si obj est null, vous obtiendrez cette erreur. Alors, essayez de le faire comme ça -

internal void Setup(MyBusinessObject obj) 
{ 
    if(obj == null) 
     MenuContainer.Visible = false; 
    else 
     MenuObject menu = MenuHelper.GetMenu(obj.State); 
} 

EDIT: Je sais que vous avez trouvé une erreur sur cette ligne, mais juste essayer de le faire comme ça. Ou, sinon, supprimez le code entier et gardez simplement la ligne MenuContainer.Visible = false;.

+0

Cher l'obj n'est pas nul seulement le MenuContainer est null. C'est pourquoi je suis perplexe. – TheVillageIdiot

0

Si MenuContainer est nul, cela a probablement quelque chose à voir avec la chronologie du cycle de vie de la page. Vous appelez cette fonction avant que MenuContainer soit lié. Pouvez-vous essayer d'appeler Setup dans la fonction PageLoad?

0

Le code affiché est le suivant:

internal void Setup(MyBusinessObject obj) 
{  
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
  • Si obj est nul, alors déréférencement obj.State sur la première ligne jetteront un NullReferenceException

  • Si obj est non nul , la ligne MenuContainer.Visible = false ne sera pas exécutée.

Donc, je ne pense pas que vous publiez tout le code pertinent.

Lorsque vous éprouvez des difficultés de débogage ce genre de chose, essayez d'enfoncer dans le code avec le débogueur ou en ajoutant certains affirme à votre code, ce qui vous aidera à voir exactement ce qui se passe:

internal void Setup(MyBusinessObject obj) 
{  
    Debug.Assert(obj != null); 
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    Debug.Assert(MenuContainer != null); 
    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
1

Merci, TheVillageIdiot, pour avoir posté la réponse à votre problème - J'ai rencontré exactement le même malentendu.

Ajout de contrôles via

<add tagPrefix="user" namespace="Frontend.Web.UserControlsAccount" assembly="Frontend.Web" /> 

dans le web.config ne suffit pas à utiliser réellement! Je l'ai essayé comme celui-ci sur une page:

<user:ucLoginMessages runat="server" ID="Msgs" /> 

... mais cela conduirait au phénomène, qu'aucun des contrôles à l'intérieur du UserControl ont été initialisé. Seulement ajouter

<%@ Register Src="~/UserControlsAccount/LoginMessages.ascx" TagPrefix="user" TagName="Messages" %> 

en haut de la page a résolu le problème :-)

Merci encore!

5

Il dépend exactement comment vous incluez les contrôles dans votre web.config. Il ne fonctionnera pas si vous essayez d'inclure tous les contrôles dans un espace de noms (bien que le concepteur vous montrera correctement la liste de vos commandes):

<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" /> 

Mais si vous ajoutez votre contrôle (s) individuellement et le point à leur emplacement physique, il fonctionnera comme prévu sans avoir à inclure des directives sans fin @Register.

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" /> 
Questions connexes