2011-07-30 10 views
3

マスターコントロールの値をユーザーコントロールから変更したい場合、このシナリオは次のようになります。
ユーザーコントロールのロード方法では、「catID」というクエリ文字列パラメータを使用してカテゴリエンティティを取得します。マスターページにあるタイトルタグ(カテゴリタイトル)の値としてのカテゴリタイトル。
ユーザーコントロールページのロードコントロールでタイトルを変更しようとしましたが、マスターページのロードメソッドが先に実行されます。マスターコントロールのコントロール値をユーザーコントロールから変更する方法は?

アイデア?

+2

これは絶対に恐ろしい練習です。 「懸念の分離」の原則とそれ以上のものに全面的に違反しています。ユーザーコントロールはマスターページを変更しないでください。さらに、ユーザーコントロールは、配置場所に依存しないようにする必要があります。あなたが持っている方法は、きついカップリングだけです。 – Mrchief

+1

@Mrchief:+1しかし、UserControlsの目的は必ずしも分離と再利用ではなく、カプセル化と単純化です。この場合、UserControl自体がコントローラのページの役割を採用し、ページは含まれているUserControlの可視性のみを制御します。 f.eを考慮する。 [TabContainerの[Lazy-loading TabPanels](http://mattberseth.com/blog/2007/07/how_to_lazyload_tabpanels_with.html)のシナリオでは、すべてのパネルにページの全機能を持つUserControlが含まれています。 –

+0

@Tim:それはここのユーザーコントロールは、ページの役割を採用しています。私のプロジェクトでは、クエリパラメータに応じてユーザーコントロールの可視性を制御するaspxは1つだけです。 – Dabbas

答えて

10

には、例えば、タイトルを設定し、あなたのマスターページでのパブリックメソッドを提供します:

public void setTitle(string title) 
{ 
    this.LblTitle.Text = title; 
} 

次に、あなたは(YourMasterPageは、マスターページの実際の型である)あなたのUserControlからそれを呼び出すことができます。

((YourMasterPage)this.Page.Master).setTitle("new Title"); 
0

クエリ文字列パラメータの場合は、マスターページコードの「catId」を読み込んでタイトルを設定する必要があります。

EDIT:

は、プロパティを試してみてください:ユーザーコントロールで マスターページ上

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.MyTitle = "SomeTitle"; 
} 
public string MyTitle { get; set; } 

protected void Page_Load(object sender, EventArgs e) 
{ 
    WebUserControl.PreRender += new EventHandler(WebUserControl_PreRender); 
} 

void WebUserControl_PreRender(object sender, EventArgs e) 
{ 
    string str = WebUserControl.MyTitle; 
    this.Header.Title = str; 
} 
+0

あなたの権利私はこれを行うことができますが、マスターページでカテゴリエンティティを取得して、すでにユーザーコントロールで取得している場合は、それがうまくいかないでしょう。 – Dabbas

+0

これはいいですが、タイトルタグを持たないdefault.aspxにユーザコントロールをロードするので動作しません...コンテナと他のいくつかのタグ...タイトルタグはマスターページにあります – Dabbas

0
((Label)Master.FindControl("loadlbl")).Text = "your text"; 
関連する問題