How do I reference an ASP.net MasterPage from App_Code

I’m working on a .net 3.5 site, standard website project.

I’ve written a custom page class in the sites App_Code folder (MyPage).

I also have a master page with a property.

public partial class MyMaster : System.Web.UI.MasterPage
{
...
    private string pageID = "";

    public string PageID
    {
        get { return pageID; }
        set { pageID = value; }
    }
}

I’m trying to reference this property from a property in MyPage.
public class MyPage : System.Web.UI.Page
{
...
        public string PageID
        {
            set
            {
                ((MyMaster)Master).PageID = value;
            }
            get
            {
                return ((MyMaster)Master).PageID;
            }
        }
}

I end up with “The type or namespace name ‘MyMaster’ could not be found. I’ve got it working by using FindControl() instead of a property on the MyMaster page, but IDs in the master page could change.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

I’ve tended to do the following with Web Site projects:

In App_Code create the the following:

BaseMaster.cs

using System.Web.UI;

public class BaseMaster : MasterPage
{
    public string MyString { get; set; }
}

BasePage.cs:
using System;
using System.Web.UI;

public class BasePage : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (null != Master && Master is BaseMaster)
        {
            ((BaseMaster)Master).MyString = "Some value";
        }
    }
}

My Master pages then inherit from BaseMaster:
using System;

public partial class Masters_MyMasterPage : BaseMaster
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(MyString))
        {
            // Do something.
        }
    }
}

And my pages inherit from BasePage:
public partial class _Default : BasePage

Method 2

I found some background to this, it happens because of the way things are built and referenced.

Everything in App_Code compiles into an assembly.

The rest, aspx files, code behind, masterpages etc, compile into another assemlby that references the App_Code one.

Hence the one way street.

And also why Ben’s solution works. Thanks Ben.

Tis all clear to me now.

Method 3

I realise there are already accepted solutions for this, but I just stumbled across this thread.

The simplest solution is the one listed in the Microsoft website
(http://msdn.microsoft.com/en-us/library/c8y19k6h.ASPX )

Basically it says, your code will work as-is, if you include an extra directive in the child page aspx:

<%@ MasterType VirtualPath="~/MyMaster.Master" %>

Then you can directly reference the property in the base MyPage by:

  public string PageID
  {
        set
        {
            Master.PageID = value;
        }
        get
        {
            return Master.PageID;
        }
    }


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x