MasterPage'e erişim

Alt sayfalardan ve kontrollerden MasterPage'e erişim nasıl sağlanır?

Enteresan bir durum ile karşılaştım. Şöyle özetlemeye çalışayım, üzerinde çalıştığım bir projede, MasterPage'ten türeyen bir MasterPage'ten türeyen bir Page içerisinde kullandığım UserControl'den, en üstteki MasterPage'e erişip bir property ye erişim sağlamam gerekti.

Ben de

  • MasterPage'ten türeyen bir sayfadan,
  • MasterPage'ten türeyen bir MasterPage'ten türeyen bir sayfadan,
  • MasterPage'ten türeyen bir MasterPage'ten türeyen bir sayfanın içerisindeki UserControl'den

en üst MasterPage'e erişim nasıl sağlanır, bunlarla ilgili örnek vereyim istedim.

Başka çözümler bulabilirsiniz, geliştirebilirsiniz ama işte benim çözümüm:

Önce, UstMasterPage'imizi türeteceğimiz abstract MyMasterPage classımızı yazalım ki, alt sayfalardan / kontrollerden erişirken rahatlıkla erişebilelim:

public abstract class MyMasterPage : MasterPage
{
    public abstract string Baslik { get; set; }
}

bu classımızı MasterPage classından türettiğimize dikkat edin. içerisindeki property de abstract tanımlı olduğundan bundan türeyecek tüm masterpage'lerimizde bu property yi implement etmek zorundayız.

Önce UstMasterPage'imizi oluşturalım:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="UstMasterPage.master.cs"
    Inherits="UstMasterPage" %>

<!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>
        <h1>
            <asp:Literal ID="litBaslik" runat="server" /></h1>
        <hr />
        <asp:ContentPlaceHolder ID="main" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Tabii ki UstMasterPage'i MyMasterPage'ten türetmeliyiz:

using System;

public partial class UstMasterPage : MyMasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public override string Baslik
    {
        get
        {
            return litBaslik.Text;
        }
        set
        {
            litBaslik.Text = value;
        }
    }
}

UstMasterPage'imiz hazır. Property aracılığı ile Literal'in text ini değiştiriyoruz. (Bu bilgi de sayfa başlığımız diye varsayıyoruz)

Şimdi bunu kullanan basit bir sayfa oluşturalım (Default.aspx)

<%@ Page Title="" Language="C#" MasterPageFile="~/UstMasterPage.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content2" ContentPlaceHolderID="main" runat="Server">
    Defaulttayız...
    <br />
    <br />
    <a href="altsayfa/AltSayfa.aspx">Altsayfa ya git</a>
    <br />
    <br />
    <br />
    <a href="altsayfa/AltSayfa2.aspx">Altsayfa2 ye git</a> Altsayfa2'de usercontrol
    bulunuyor, onun içerisinden üst masterpage e erişiyoruz..
</asp:Content>
using System;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        MyMasterPage master = this.Master as MyMasterPage;
        master.Baslik = "Default :)";
    }
}

this.Master ile direkt olarak UstMasterPage'imize erişebildik.

Şimdi bundan türeyen bir MasterPage'ten türeyen bir sayfadan erişim sağlayalım:

AltMasterPage.master:

<%@ Master Language="C#" MasterPageFile="~/UstMasterPage.master" AutoEventWireup="true"
    CodeFile="AltMasterPage.master.cs" Inherits="altsayfa_AltMasterPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="main" runat="Server">
    <asp:ContentPlaceHolder ID="main" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>
using System;

public partial class altsayfa_AltMasterPage : UstMasterPage
{
    protected new void Page_Load(object sender, EventArgs e)
    {

    }
}

UstMasterPage'in PageLoad olayını gölgelediğimiz için new anahtar kelimesi ile derleyiciye bunun farkında olduğumuzu söylüyoruz.

Şimdi bunu kullanan AltSayfa.aspx'imiz:

<%@ Page Title="" Language="C#" MasterPageFile="~/altsayfa/AltMasterPage.master" AutoEventWireup="true" CodeFile="AltSayfa.aspx.cs" Inherits="altsayfa_AltSayfa" %>

<asp:Content ID="Content1" ContentPlaceHolderID="main" Runat="Server">
Alt sayfadayız...

</asp:Content>
using System;

public partial class altsayfa_AltSayfa : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        MyMasterPage master = this.Master.Master as MyMasterPage;
        master.Baslik = "Altsayfa :)";
    }
}

this.Master.Master ile UstMasterPage'imize erişebildik.

Şimdi de UserControl içerisinden erişelim. Önce bir sayfa ekleyelim:

<%@ Page Title="" Language="C#" MasterPageFile="~/altsayfa/AltMasterPage.master"
    AutoEventWireup="true" CodeFile="AltSayfa2.aspx.cs" Inherits="altsayfa_AltSayfa2" %>

<%@ Register Src="UC_Kontrol.ascx" TagName="UC_Kontrol" TagPrefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="main" runat="Server">
    altsayfa2 deyiz
    <br />
    <hr />
    <br />
    <uc1:UC_Kontrol ID="UC_Kontrol1" runat="server" />
</asp:Content>

UserControl içerisinden erişim:

using System;

public partial class altsayfa_UC_Kontrol : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        MyMasterPage master = this.Page.Master.Master as MyMasterPage;
        master.Baslik = "User Control :)";
    }
}

this.Page.Master.Master ile UstMasterPage'imize erişebildik.

Klasör ve dosya yapısı şu şekilde:

nested-master-page

 

Projeyi indirmek için buraya tıklayabilirsiniz. 

 


Şimdi kilit noktalar:

  1. UstMasterPage'imizi, MasterPage'ten türeyen bir abstract class'tan türettik ki alt sayfalarda ilgili property lere kolay bir şekilde erişebilelim.
  2. UstMasterPage'te ilgili property yi override ettiğimize dikkat edin.
  3. Sayfalarımızda (.aspx) this.Master referansı üzerinden erişim sağladık.
  4. UstMasterPage'i kullanan, AltMasterPage'ten türeyen alt sayfada this.Master.Master referansını kullandık.
  5. AltMasterPage'ten türeyen alt sayfadaki bir UserControl içerisinde this.Page.Master.Master referansı ile erişim sağladık.

Herkese kolay gelsin.