- ベストアンサー
【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) { // ここにボタンが押された際の処理を実装したい } --------------------------------------------------------------------------- よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
質問内容が間違っていると指摘しましたが、恐らく下記のようなことをやりたいんじゃないかと思い、推測で答えを書いてみました。 ご確認ください。 ============== 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)
- TATUMIN000
- ベストアンサー率0% (0/1)
すみません、回答番号:No.4は上記URLに転記しました。 回答番号:No.4についての回答は、 大変お手数ですがこちらを参照頂く様お願いいたします。
- TATUMIN000
- ベストアンサー率0% (0/1)
すみません、少し前の話なんですが便乗させて下さい。 私もよく分からないので、ググってみたら こちらのページにたどり着きました。 [aspnet]さんの回答を参考に 【マスタページ側に、@MasterTypeディレクティブを追加、Name属性を書き、コードビハインドのクラス名で固める】 方法が簡単でかつ汎用性があるなあ、と思って やってみよー!、と思ったのですが、 「マスタページ」に 「<@ MasterType Name="Hoge"@>」を追加したのですが、 「属性 'Name' は要素 'MasterType' の有効な属性ではありません」 エラーが発生し、追加できません。 似たようなプロパティで「TypeName」があったので、 <%@ MasterType TypeName="Hoge" %>としてみましたが、 今度は「型 'hoge' を読み込めませんでした。」の エラーが発生してしまいます;;。 [aspnet]さんの回答内容を実現できる方、いらっしゃいませんか? アホな私にやり方を教えて下さい…;;。 いろいろググってると、「MasterType 」はコンテンツページ(~.aspx)に書くようなんですが…。 これをマスタページに書くこともできるんですか? 以上です。便乗申し訳ありません。
- aspnet
- ベストアンサー率79% (72/91)
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")とかで探す方法もありますが、インテリセンスが利かない泥臭いやりかたはスルーでしょう。
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 の記述なのではないかと思いますが、間違いございませんか? 正しい情報を頂かないと正しい回答もできないと思うので、 申し訳ございませんが、もう一度、質問内容を整理して 頂けないかと思います。宜しくお願いします。