2009-05-21 6 views
5

私はasp:Literalを含むユーザーコントロールを持っています。asp:ユーザーコントロールのリテラルコントロールnull

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

コントロールを初期化するコードビハインドページ内のメソッドがあります:コントロールは、私はLoadCompleteイベントハンドラでコントロールの方法セットアップを呼び出して使用されているページで

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

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

    //other code 
} 

は、 (私は最初にロードイベントでそれを呼び出していた)。

Object reference not set to an instance of an object. 

理由は何であり、このために救済策です:私は、ユーザーコントロールにリテラルにアクセスする際に関わらずのは、私はエラーを取得し、nullまたはNOT NULLであること MyBusinessObject?

+0

それは私のためにうまく働いています。他にも問題があるかもしれません。ウェブサイト全体をコンパイルしてみてください。そして、ところで、そのユーザーコントロールの他のコントロールに正しくアクセスできますか? – Kirtan

+0

これは実際にはユーザーコントロールの唯一のコントロールです – TheVillageIdiot

答えて

11

それを非常に簡単でした。私はweb.configのコントロールセクションに、Rick Sthralで提案されたようなものを追加していました(投稿については、彼のページで検索しなければなりません)。

私は、 @ Registerタグを入れないでコントロールしましたが、コントロールの子コントロールがnullとして表示されていました。だから私は単に@ Registerディレクティブを自分のページに入れてしまった。

+0

+1、ありがとう!誰もこの無意味な解決策を説明することはできますか? web.configのショートカットで、Registerディレクティブでページマークアップを捨てる必要がなくなったのでしょうか?このような不思議で髪を引っ張るようなエラーを防ぐには、それをそこに置かなければならないのはなぜですか?さて、。 –

+0

@ヤディンそれは私が理解できないものです。私はRickのブログにコメントしましたが、返事がありません。 – TheVillageIdiot

0

MenuContainerは問題ですか? Setup関数の最初の行でobj.Stateを参照しています。そのobjがnullの場合、そのエラーが発生します。

+0

はい、問題です。 if(obj == null)が渡されます。 MenuContainer.Visibleは例外をスローします。 – TheVillageIdiot

0

答えのJerSchneidで説明したように、objがnullの場合、そのエラーが発生します。だから、このようにそれをやってみてください -

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

編集:私はあなたがそのライン上のエラーを取得している知っているが、ちょうどこのようにそれをやってみてください。または、コード全体を削除して、そのままMenuContainer.Visible = false;行にしてください。

+0

objがnullでない場合は、MenuContainerだけがnullです。それが私が困惑している理由です。 – TheVillageIdiot

0

MenuContainerがnullの場合、おそらくページライフサイクルのタイムラインと関係があります。 MenuContainerがリンクされる前にその関数を呼び出しています。 Page_Load関数でSetupを呼び出せますか?

0

あなたが投稿したコードは以下の通りです:objがnullでない場合

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

    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
  • objがnullの場合は、最初の行にobj.Stateを参照解除することとNullReferenceException

  • がスローされますMenuContainer.Visible = false行は実行されません。

私はあなたが関連するすべてのコードを投稿しているとは思いません。

あなたはこの種のものをデバッグする難しさを抱えている場合は、デバッガでコードをステップ実行するか、いくつかのあなたは正確に何が起こっているか確認するために役立ちます、あなたのコードにアサート追加してみてください:

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

あなたの問題への回答を投稿してくれてありがとう、TheVillageIdiot - 私はまったく同じ誤解に遭遇しました。 web.configファイルで

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

を経由してコントロールの追加

は、実際にそれを使用するのに十分ではなかったです!

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

...しかし、これはユーザーコントロール内のコントロールのどれが初期化されなかったこと、現象につながる:私は、ページ上でこのようにそれを試してみました。唯一のページの最上部に

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

を追加すると、再び

感謝:-)問題を解決しました!

5

正確にはに従います。あなたのweb.configにコントロールが含まれています。あなたがコントロール(複数可)を追加した場合、個別にポイント

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

しかし:それはあなたが名前空間にすべてのコントロールを含めるしようとした場合(設計者が正しくあなたのコントロールの一覧が表示されますが)動作しません。それらの物理的な場所には、無限の@Register指令を含める必要なしに期待どおりに動作します。

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" /> 
関連する問題