• ベストアンサー

【ASP.NET】マスターページに配置されたボタンのイベントを拾いたい

※こちらの派生です。 http://oshiete1.goo.ne.jp/qa5222698.html マスターページに配置したボタンのクリックイベントを コンテンツページ(?マスターページを使用するページ)で 拾うことは可能でしょうか? もしくは、マスターページに配置したボタンのクリックイベントの処理を コンテンツページで実装することは可能でしょうか? ボタンの配置は同じだけれど、メソッドの中の処理は コンテンツページ毎に分けたいのです。 例えばマスターページ「hoge」とコンテンツページ「moge」があったとすると 以下のような感じです…。 --------------------------------------------------------------------------- ============== hoge.Master ============== <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="hoge.master.cs" Inherits="xxx.hoge" %> <asp:Content ID="Content3" ContentPlaceHolderID="FooterContentPlaceHolder" runat="server"> <asp:Button ID="btn" runat="server" Text="ぼたん" onclick="btn_Click" /> </asp:Content> ============== hoge.Master.cs ============== protected void btn_Click(object sender, EventArgs e) { // ここではなく } ============== moge.aspx ============== <%@ Page Language="C#" MasterPageFile="~/hoge.Master" AutoEventWireup="true" CodeBehind="moge.aspx.cs" Inherits="xxx.moge" Title="もげ" %> ============== moge.aspx.cs ============== protected void btn_Click(object sender, EventArgs e) { // ここにボタンが押された際の処理を実装したい } --------------------------------------------------------------------------- よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#158371
noname#158371
回答No.2

質問内容が間違っていると指摘しましたが、恐らく下記のようなことをやりたいんじゃないかと思い、推測で答えを書いてみました。 ご確認ください。 ============== hoge.Master ============== <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="hoge.master.cs" Inherits="MasterPage" %> <asp:contentplaceholder id="FooterContentPlaceHolder" runat="server"> <%-- ここにaspxのコンテンツをaspxファイルで配置してもらう --%> </asp:contentplaceholder> <%-- MasterPage に配置したボタン--%> <asp:Button ID="btn" runat="server" Text="ぼたん" /> ============== hoge.Master.cs ============== public partial class MasterPage : System.Web.UI.MasterPage {   // aspx側に公開するボタンのクリックイベント   public EventHandler btnClick_PageHandler;   // MasterPage表示時   protected void Page_Load(object sender, EventArgs e)   {     // aspx側で処理するボタンのクリックイベントが設定されていたら     if (btnClick_PageHandler != null)     {       // aspx側で定義したボタンクリックイベントを設定する       btn.Click += btnClick_PageHandler;     }   } } ============== moge.aspx ============== <%@ Page Language="C#" MasterPageFile="~/hoge.Master" AutoEventWireup="true" CodeBehind="moge.aspx.cs" Inherits="xxx.moge" Title="もげ" %> ============== moge.aspx.cs ============== protected void Page_Init(object sender, EventArgs e) {   // MasterPageのインスタンスを取得する   ASP.hoge_master m = (ASP.hoge_master)this.Master;   // MasterPageにあるボタンにクリックイベントを付与する   m.btnClick_PageHandler += new EventHandler(this.MasterPageButton_Click); } private void MasterPageButton_Click(object sender, EventArgs e) {   // ここにMasterPageで定義したボタンのクリックイベントを実装する } もし、質問したかった内容と回答内容が違うようであれば、もう一度、情報を整理してご質問頂けるとた有難いです。 宜しくお願いします。

その他の回答 (4)

回答No.5

すみません、回答番号:No.4は上記URLに転記しました。 回答番号:No.4についての回答は、 大変お手数ですがこちらを参照頂く様お願いいたします。

参考URL:
http://ap.atmarkit.co.jp/bbs/core/fdotnet/16690
回答No.4

すみません、少し前の話なんですが便乗させて下さい。  私もよく分からないので、ググってみたら  こちらのページにたどり着きました。  [aspnet]さんの回答を参考に  【マスタページ側に、@MasterTypeディレクティブを追加、Name属性を書き、コードビハインドのクラス名で固める】  方法が簡単でかつ汎用性があるなあ、と思って  やってみよー!、と思ったのですが、  「マスタページ」に  「<@ MasterType Name="Hoge"@>」を追加したのですが、  「属性 'Name' は要素 'MasterType' の有効な属性ではありません」  エラーが発生し、追加できません。  似たようなプロパティで「TypeName」があったので、  <%@ MasterType TypeName="Hoge" %>としてみましたが、  今度は「型 'hoge' を読み込めませんでした。」の  エラーが発生してしまいます;;。  [aspnet]さんの回答内容を実現できる方、いらっしゃいませんか?  アホな私にやり方を教えて下さい…;;。  いろいろググってると、「MasterType 」はコンテンツページ(~.aspx)に書くようなんですが…。  これをマスタページに書くこともできるんですか? 以上です。便乗申し訳ありません。

  • aspnet
  • ベストアンサー率79% (72/91)
回答No.3

MasterPage上のオブジェクトを、コンテンツページから捕捉したい、ということですよね? (コントロールイベントを拾ったり、プロパティに値をセットしたい……etc) ならば、 【マスタページ側に、@Masterディレクティブを追加、ClassName属性を書き、これをコンテンツページから指定する】 <%Master ClassName="Hoge">としておき、コンテンツページから、 ((ASP.Hoge)Master).btn でコントロールが可視になります(エディタ上でIntelliSense効く)。 【マスタページ側に、@MasterTypeディレクティブを追加、Name属性を書き、コードビハインドのクラス名で固める】 <@ MasterType Name="Hoge">としておき、コンテンツページから、 Master.btn.なんたらかんから でコントロールが可視になります。こちらの方法がオシャレ? 要するに、「オイラのMasterとしての型はHogeだ」と宣言するわけです。 コンテンツページがマスタページを参照するには、必ずMasterプロパティを使います。こいつはよくわからないのですが、動的にコンパイルされるマスタページをコンテンツページから見た型のようです。 Master.FindControl("xxx")とかで探す方法もありますが、インテリセンスが利かない泥臭いやりかたはスルーでしょう。

noname#158371
noname#158371
回答No.1

hoge.Masterに、 <asp:Content ID="Content3" ContentPlaceHolderID="FooterContentPlaceHolder" runat="server"> <asp:Button ID="btn" runat="server" Text="ぼたん" onclick="btn_Click" /> </asp:Content> という記述があるということは、さらなるMasterPageを参照させてますか? 質問内容を見る限り、moge.aspx の記述なのではないかと思いますが、間違いございませんか? 正しい情報を頂かないと正しい回答もできないと思うので、 申し訳ございませんが、もう一度、質問内容を整理して 頂けないかと思います。宜しくお願いします。

関連するQ&A