Доступ к свойству мастер-страницы из класса, который не является частью страницы содержимого в 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";
}
...