Доступ к свойству мастер-страницы из класса, который не является частью страницы содержимого в ASP.NET

Итак, я подключаю свой первый MasterPage, и все работает отлично, кроме одной вещи. Это устаревшее приложение, и у меня есть старый класс BasePage, который наследуют все мои страницы контента. Он наследуется от System.Web.UI.Page, но сам по себе не имеет содержимого (нет файла.aspx). Он запускает кучу меню аутентификации пользователя / предоставления роли. Я хочу сохранить эту функциональность, но использовать ее, чтобы установить элементы управления на моей MasterPage для создания меню. Я не могу понять, как ссылаться на свойства MasterPage без объявления MasterType на странице содержимого.

Мой класс MasterPage называется NIMS_Master, и у меня есть следующее (просто пытаюсь начать):

public partial class NIMS_Master : System.Web.UI.MasterPage { public string MenuList { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {}
  }

С объявлением MasterType на одной из моих страниц контента:
<%@ MasterType VirtualPath="~/NIMS_Master.master" %>

Я могу получить доступ к своей собственности в Login.aspx.cs следующим образом:

this.Master.MenuList = "this is the menu list";

Но в моем BasePage.cs мне некуда поместить объявление MasterType. Все поиски в Google показывают, что я должен разыграть свой класс NIMS_Master как Мастер, но я не могу заставить его работать, чтобы спасти мою жизнь. Я пробовал несколько разных вещей, но мой класс NIMS_Master просто не отображается в BasePage.

((this.Master)NIMS_Master).MenuList = "This is a menu list";

BasePage.cs находится в моем каталоге App_Code, а мой файл MasterPage находится в корне приложения, если это имеет значение.

3 ответа

Решение

Поэтому у меня был BasePage в App_Code и я пытался установить свойство моего класса NIMS_Master, которое находилось в корневом каталоге приложения. Мне пришлось создать класс MasterBase, который наследуется от System.Web.UI.MasterPage в App_Code, и поместить туда свои свойства. Боже, я даже не уверен, почему я думал, что могу получить доступ к этим свойствам класса из app_code.

На мой взгляд, ваш актерский состав должен быть: ((NIMS_Master)this.Master).MenuList

MasterBase работал для меня тоже, спасибо fr0man.

В моем случае в моем файле master.aspx.cs было открытое свойство, которое я переместил в новый класс MasterBase, чтобы он мог быть доступен другим классам.

Шаг 1: Создайте новый файл MasterBase.cs в вашем каталоге App_Code. (Ниже мой полный класс.)

public partial class MasterBase : System.Web.UI.MasterPage
{
    public string MyProperty = "Default";
}

Шаг 2: Обновите файл Master.aspx.cs для наследования от вашего базового класса вместо System.Web.UI.MasterPage и удалите все объявления свойств, которые вы переместили в класс MasterBase. (Ниже приведены первые несколько строк класса.)

public partial class Master : MasterBase
{
    //The following is now defined in MasterBase.
    //public string MyProperty = "Default";
...

Шаг 3: приведите страницу. Мастер к MasterBase, чтобы получить доступ к его свойствам.

...
    IHttpHandler page = HttpContext.Current.Handler;
    if (page is System.Web.UI.Page)
    {
        MasterBase masterPage = (MasterBase)((System.Web.UI.Page)page).Master;
        if (masterPage != null)
            masterPage.MyProperty = "New Value";
    }
...
Другие вопросы по тегам