2009-09-03 3 views
2

同じマスターページのコードビハインドを介して、子のマスターページにリテラルユーザーコントロールの値を設定しようとしています。ここで子マスターページのユーザーコントロールへのアクセス先子マスターページコード

は、私が使用していたコードの例を次に示します。

Global.master

<form id="form1" runat="server"> 
<div> 
    <asp:ContentPlaceHolder id="GlobalContentPlaceHolderBody" runat="server"> 

    </asp:ContentPlaceHolder> 
</div> 
</form> 

Template.master(Global.masterの子)

<asp:Content ID="TemplateContentBody" ContentPlaceHolderID="GlobalContentPlaceHolderBody" Runat="Server"> 
<asp:Literal ID="MyLiteral1" runat="Server"></asp:Literal> 

<p>This is template sample content!</p> 
    <asp:ContentPlaceHolder ID="TemplateContentPlaceHolderBody" runat="server"> 

</asp:ContentPlaceHolder> 

Template.master.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyLiteral1.Text = "Test"; 
} 

ContentPage.aspx

< asp:Content ID="ContentBody" ContentPlaceHolderID="TemplateContentPlaceHolderBody" Runat="Server"> 
</asp:Content> 

私はこれを達成することができていたら、私はまた、グローバルテンプレート上のコンテンツにアクセスできるようにする必要があります。コンテンツページを介してマスターページ。

+0

どのようなエラーが表示されますか? – MattH

+0

エラーは表示されませんが、リテラルは更新されていません。 – jpshook

+0

これはばかばかしいかもしれませんが、WebサイトやWebアプリケーションを作成していますか?後で、あなたはあなたのサイトをコンパイルしていませんか? –

答えて

1

ワーキング解決策を見つけた

あなたは、再帰的にFindControl関数を使用することができます。 template.master(ネストされた子マスター)では、OnLoadイベントにコードを挿入する必要がありました。

protected override void OnLoad(EventArgs e) 
{ 
    MyLiteral1.Text= "<p>MyLiteral1 Successfully updated from nested template!</p>"; 
    base.OnLoad(e); 
} 

非常に奇妙な...

基本的に、私はすべてのページに共有コードを持っているページとしてグローバルマスターを使用していますし、私は、各ウェブサイトのセクションに合わせて様々なネストされたページがあります。ナビゲーションネストされたテンプレートの場合、ユーザーがログインしているかどうか、およびショッピングカートのアイテム数を表示できるようにしたい。

これを達成するためのより良い方法がある場合は、私は提案をすることができます。

+0

これはそれを行う方法です。これはPage_Loadではうまくいきませんでした。 – Chris

0

EDIT:これは親マスターコードの子マスターのコントロールにアクセスしようとしていると思ったときの私の答えです。

protected Control FindControlRecursive(string id, Control parent) 
{ 
    // If parent is the control we're looking for, return it 
    if (string.Compare(parent.ID, id, true) == 0) 
     return parent; 

    // Search through children 
    foreach (Control child in parent.Controls) 
    { 
     Control match = FindControlRecursive(id, child); 

     if (match != null) 
      return match; 
    } 

    // If we reach here then no control with id was found 
    return null; 
} 

は、その後、あなたのマスタページにこのコードを使用します:

protected void Page_Load(object sender, EventArgs e) 
{ 
//EDIT: if GlobalContentPlaceHolderBody isn't visible here, use this instead: 
//Control c = FindControlRecursive("MyLiteral1", Page.FindControl("GlobalContentPlaceHolderBody")); 
    Control c = FindControlRecursive("MyLiteral1", GlobalContentPlaceHolderBody); 
    if(c != null) 
     ((Literal)c).Text = "Test"; 
} 
+0

保護されたコントロールのFindControlRecursiveはどこに配置しますか?私はそれをTemplate.masterに追加します。cs、私はエラーが表示されます:名前 'GlobalContentPlaceHolderBody'は、現在のコンテキストに存在しません。 – jpshook

+0

コンテンツページ経由でマスターのユーザーコントロールにアクセスするには、単純でした。 template.master.csに次を追加しました: 公開ストリングContentLabelDemoPublic { セット { ContentLabelDemo.Text = value; }} 、その後、コンテンツページに私が追加することができます。 ((MasterPages_Template)マスター).ContentLabelDemoPublic =「コンテンツ・ページによって更新パブリック変数を用いて露光子マスターページ上のラベルを」; ネストされたマスターページに、独自のコードビハインドでアクセスするのは難しいことではありません。 – jpshook

+0

GlobalContentPlaceHolderBodyは、コンテナのIDです。それがあなたのコードに見えない場合、Page.FindControl( "GlobalContentPlaceHolderBody"); – Chris

3

あなたのシナリオを理解している場合は、コンテンツページにマスターページのアイテムにアクセスさせたいと思っています。その場合は、マスターページから公開するプロパティを設定し、コンテンツページでMasterTypeディレクティブを設定する必要があります。

たとえば、this postを見てください。

+0

あなたのタイトルは、あなたの最後の文章と矛盾しています。「...私もコンテンツページからコンテンツにアクセスできる必要があります。」代わりにマスターページから何かをしようとしているのでなければ、私が提案している答えはこの状況をカバーしています。 –

+0

+1私たちが話しているのは、親のマスターページのコントロールにアクセスしているのであれば、MasterTypeディレクティブが私たちが探しているものです。 –

+0

Ahmad、私はネストされた子のマスターページのコントロールに、それ自身のコードを介してアクセスしようとしていました。修正は、OnLoadイベントで呼び出すことでした。 Alexis - MasterTypeディレクティブは、ネストされたマスターページ自体からではなく、コンテンツページからのアクセスに役立ちます。 – jpshook

関連する問題