を含むマスターページがありますDropDownList
。マスターにリストをバインドする関数があり、正常に動作します。
私の問題は、上記のマスターページの子ではないフォームからそのマスターページ関数をどのように呼び出すかです。
こちらの記事をご覧ください。
これは、ASP.NET 2.0 の新しいコンパイル モデルから得られる優れた機能です。次のように、マスター ページのコード ビハインド ファイルにカスタム プロパティを追加するとします。
partial class otcMaster : System.Web.UI.MasterPage
{
public string FooterText {
get { return Footer.Text; }
set { Footer.Text = value; }
}
}
MasterPage 参照を返す継承された Master プロパティを使用して、Web フォームのマスター ページにアクセスできます。ただし、otcMasterPage で定義されたプロパティにアクセスするには、キャストを使用する必要があると考えるかもしれません。
((otcMaster)Master).FooterText == "foo"
フレームワークや静的型付け言語を使用する場合、派生型へのキャストは生活の一部に過ぎませんが、もっと良い方法があります。ASPX で @ MasterType ディレクティブを使用します。
<%@ MasterType VirtualPath="~/otc.master" %>
ASP.NET がページを codegens すると、部分的なクラス定義内に次のコードが挿入されます。Shadows キーワードに注意してください (これは、セミコロン ランドの新しいキーワードです [ええ、私は別の言語を試しています])。
public new otc Master {
get { return (otcMaster)base.Master; }
}
その結果、厳密に型指定されたマスター ページが作成されます。キャストは必要ありません。Master.FooterText プロパティに直接移動できます。これを行う別の方法は、@MasterType ディレクティブで TypeName を指定することです。
で public メソッドを提供してMasterPage
から、ContentPage のMaster
プロパティを適切な型にキャストする必要があります。
public void DataBindDropDowns()
{
// ...
}
次に、次の方法で ContentPages から呼び出すことができます (マスターページのタイプが呼び出されると仮定しますSiteMaster
:
((SiteMaster)this.Page.Master).DataBindDropDowns();
編集:
...上記のマスターページの子ではない
ContentPage
それはあのマスターのものではないということだと思いますよね?次に、次の場合を除き、マスターへの参照を取得することはできません。
HTTP-Handler
マスター ページは実際には の子であり、ContentPage
それにマージされることに注意してください。存在しないオブジェクトへの参照を取得することはできません!
MSDNから:
マスター ページはコンテンツ ページの一部になることに注意してください。実際には、マスター ページはユーザー コントロールとほぼ同じように機能します。つまり、コンテンツ ページの子として、またそのページ内のコンテナーとして機能します。
非常に頻繁に作成する場合は、BasePage
から派生した を作成しSystem.Web.UI.Page
、それをフォームのベージ ページとして使用できます。
そこで、マスター ページのタイプのプロパティを追加して、マスター ページのすべてのパブリック メンバーにアクセスできるようにします。
マスター ページ クラスがSite1
の場合、BasePage
.
public class BasePage : System.Web.UI.Page
{
protected Site1 Site1Master
{
get { return Master as Site1; }
}
}
次に、マスターページのメソッドにアクセスする必要があるページで、次のように置き換えます。
public partial class DefaultPage : System.Web.UI.Page
と
public partial class DefaultPage : BasePage
次に、プロパティ Site1Master をページで使用できるようにし、次のようにそのパブリック メンバーを使用できます。
Site1Master.MyBindingFunction(...);
BasePage に他の必要な機能を追加することもできます。
注: ページでプロパティが null でないことを確認したい場合は、次のSite1
ように、ページにマスターがあるかどうかを確認するチェックを追加できます。
protected Site1 Site1Master
{
get
{
if (!(Master is Site1))
throw new Exception("This page doesn's have Site1 as master page");
return Master as Site1;
}
}
マスター ページのメンバーにアクセスするために、ページ コンテンツで公開されているマスター プロパティがあります。最初に @ MasterType ディレクティブを指定する必要があります:
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
次に、マスターページでパブリック関数を作成し、コンテンツページで呼び出すだけです
Master.MethodNameInMaster()
より良い設計のために、EventAggregator パターンを使用します。カスタム イベントを作成し、マスター ページで処理します。
これをページ コードに挿入します (ここで、MyMasterPage はマスター ページ オブジェクトです)。
MyMasterPage masterPage = (MyMasterPage) this.Master;
masterPage.MyBindDropDownListFunction(); // Replace with your public function name
MasterPage プロパティを参照し、マスター ページ タイプにキャストして、メソッドを呼び出す必要があります。
((MyMasterPage)this.Master).MyBindingFunction();