Как управлять элементами на главной странице asp.net с дочерней страницы

У меня есть несколько страниц на моем веб-сайте asp.net, на которых я хотел бы отключить элемент управления на главной странице. Есть ли способ связаться с главной страницей с дочерней страницы?


person Lloyd    schedule 07.07.2009    source источник


Ответы (5)


Самый простой способ - настроить свойство на главной странице, которое при вызове обрабатывает функцию включения / выключения. Затем на своей дочерней странице установите директиву MasterType, чтобы получить строго типизированную ссылку на вашу мастер-страницу, чтобы обойтись без трансляции.

На вашей дочерней странице будут:

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

И чтобы вызвать свойство главной страницы:

Master.MyLabel = false; // or true

Итак, на вашем хозяине у вас может быть:

public bool MyLabel
{
    get
    {
        return masterLabel.Enabled;
    }
    set
    {
        masterLabel.Enabled = value;
    }
}
person Ahmad Mageed    schedule 07.07.2009
comment
Маркс Ансер заставил меня пойти на это, но вот как я смог его реализовать. Спасибо Ахмад. - person Lloyd; 07.07.2009
comment
Хороший. Одна вещь, которую вы можете сделать, - это зайти в свой файл .designer.cs и изменить область действия элемента управления на общедоступную, тогда у вас будут все свойства для использования в логике вашей страницы. Кроме того, если вы открываете общедоступное свойство, обычно лучше использовать CamelCase, pascalCase предназначен для частных полей. :) - person Mark Dickinson; 07.07.2009
comment
@Mark: хорошая информация! Я согласен насчет CamelCase, пропустил. Исправлено сейчас. - person Ahmad Mageed; 07.07.2009
comment
@Mark: лучше не раскрывать элементы управления главной страницы. Что, если изменится макет главной страницы? Просто покажите свойство, метод или событие. - person John Saunders; 07.07.2009
comment
@John - да, это лучшая практика. Думаю, Ахмад своим ответом попал в точку. Я просто хотел проиллюстрировать, что элементы управления можно полностью раскрыть, но будет справедливо сказать, что это не всегда разумно, спасибо :) - person Mark Dickinson; 08.07.2009
comment
У меня это прекрасно работает. Единственная проблема, которая у меня есть, заключается в том, что кажется, что метка на главном сервере отображается до того, как мой дочерний page_load изменит свое значение. Результат = этикетка не изменилась. Должен ли я делать это по другому распорядку? - person Mike K; 20.05.2010
comment
+1 Потратьте несколько часов на поиск <%@ MasterType VirtualPath="~/Site1.Master" %> Спасибо, сэр, мой голос за вас =) - person Michel Ayres; 26.12.2012
comment
@MarkDickinson Вы могли перепутать camelCase и PascalCase в своем комментарии выше. См. стили заглавных букв. - person JW Lim; 14.05.2014

Вам необходимо использовать директиву MasterType в разметке вашей страницы.

<%@ MasterType TypeName="Namespace.Etc.MyMasterPage" %>

Тогда вы сможете получить доступ к любым общедоступным свойствам главной страницы страницы, используя

this.Master.PropertyIWantToIntefereWith...

Надеюсь это поможет

person Mark Dickinson    schedule 07.07.2009
comment
Я делал это через кастинг объекта Page ... это звучит ТАК намного лучше! Спасибо! - person CodeRedick; 07.07.2009
comment
Мне было непонятно, где определять значение TypeName, поэтому я использовал параметр VirtualPath для MasterType, и он отлично сработал. Спасибо! - person Lloyd; 07.07.2009
comment
+1 действительно !!! Я тоже не знал об этом, и это значительно упрощает работу с некоторыми элементами навигации в моем приложении! - person Dillie-O; 07.07.2009

Вот пример того, как взаимодействовать с мастер-страницами из дочерних страниц.

На главной странице создайте свойство для элемента управления, к которому вы хотите получить доступ, скажем, метку с именем lblUser ...

public string MyProperty
       {
        set { lblUser.Text = value; }
       }

На дочерней странице перейдите к только что созданному свойству, как в следующем примере ...

((MyMaster)this.Master).MyProperty = "Text changed from Sub Page";

Мы можем это сделать, потому что Мастер - это просто класс, наследующий System.Web.UI.MasterPage.

А созданное нами свойство Label.Text является просто свойством мастер-класса (это имя будет конкретным именем вашей текущей мастер-страницы, в данном случае MyMaster).

Обратите внимание, что это не будет работать без приведения к вашему конкретному классу мастер-страницы, потому что вы добавили поле, которое не существует в System.Web.UI.MasterPage, тип this.Master, но в вашем конкретном мастер-классе.

person Joe    schedule 07.07.2009

Я искал что-то подобное, но это решение, похоже, мне не подходит. У меня есть вложенная главная страница. Это работает для вложенного мастера? Когда я реализовал, он не распознает элемент управления, который я добавил своему мастеру.

person Community    schedule 07.07.2009

person    schedule
comment
@GenericTypeTea Это то, что они делают в документации хотя - person Zorgarath; 20.07.2015