- ベストアンサー
ASP.NETのマスタページで多階層のアクセス方法について
- ASP.NETのマスタページを使ったWebアプリケーション開発では、多層構造のマスタページにプロパティやメソッドが分散しています。
- 子ページから一つ上のマスタページにアクセスする方法は簡単ですが、2つ以上離れた階層にアクセスする方法はありません。
- 上位階層のマスターページにメソッドを準備して、順繰りに呼び出す方法がありますが、もっとスマートな方法はありません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マスタ1[Site1.Master] ┗マスタ2[Site2.Master] ┗ページ[WebForm1.aspx] で、ページからマスタ1のパブリックメソッドをよぶって事? そうであれば、こんな感じで順序良くキャストしてあげれば、わかりやすいかと。。。 protected void Button1_Click(object sender, EventArgs e) { Site2 l_mst2 = (Site2)this.Master; Site1 l_mst1 = (Site1)l_mst2.Master; l_mst1.パブリックメソッド(); }
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
マスタページを継承するSite1クラスはpublicになっていますか? マスタページとnamespaceが埋め込まれるページと異なってはいませんか? 私の環境では、単純に作成しただけで実行できています。 新規にプロジェクトを作成し、違いを探した方が早いかも? 「webmaster」というネームスペースで以下のように私のところでは作成しました。 ***************** マスタ:Site1 ***************** [Site1.Master] <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="webmaster.Site1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> <asp:ContentPlaceHolder ID="cp1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html> [Site1.Master.cs] namespace webmaster { public partial class Site1 : System.Web.UI.MasterPage { public void パブリックメソッド() { return; } } } ***************** マスタ:Site2 ***************** [Site2.Master] <%@ Master Language="C#" MasterPageFile="Site1.Master" Codebehind="Site2.master.cs" Inherits="webmaster.Site2" %> <asp:Content ID="pageContent" runat="server" ContentPlaceHolderID="cp1"> <asp:ContentPlaceHolder ID="cp2" runat="server"> </asp:ContentPlaceHolder> </asp:Content> ***************** ページ:WebForm1 ***************** [WebForm1.aspx] <%@ Page Language="C#" MasterPageFile="Site2.Master" Codebehind="WebForm1.aspx.cs" Inherits="webmaster.WebForm1" %> <asp:Content ID="pageContent" runat="server" ContentPlaceHolderID="cp2"> <asp:Button ID="btn1" runat="server" Text="ボタン" OnClick="Button1_Click" /> </asp:Content> [WebForm1.aspx.cs] namespace webmaster { public partial class WebForm1 : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Site2 l_mst2 = (Site2)this.Master; Site1 l_mst1 = (Site1)l_mst2.Master; l_mst1.パブリックメソッド(); } } } となっています。
お礼
回答ありがとうございます。 しかしページをビルドすると、 エラー 型または名前空間名 'Site1'が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 となります。l_mst2.Masterは、確かにツールヒントで'Site1'型と表示されますが、WebForm1.aspxからASP.Site1は参照できません。