Веб-элемент управления добавлен в тип элемента управления .master, не найденный на дочерней странице. - PullRequest
2 голосов
/ 07 июня 2010

У меня есть проект веб-сайта, и в нем у меня есть пользовательский веб-элемент управления, определенный в файле ascx.

Элемент управления добавлен в Site.Master, и он корректно отображается на странице, и все в порядке.

Мне нужно переопределить некоторые поля элемента управления на одной из страниц, которые происходят от Site.Master.

// In OnLoad:
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID"));

Проблема в том, что MyControlName не регистрируется как допустимый тип на дочерней странице. Если я добавлю второй экземпляр элемента управления непосредственно на дочернюю страницу, вышеуказанное будет работать по мере необходимости, но если элемент управления не помещается непосредственно на страницу и вместо этого определяется только на главной странице, тип не определен. Элемент управления не находится в пространстве имен и определен в проекте, поэтому я не знаю, почему у него такое расположение проблемы соответствующего типа.

Если я добавлю точку останова в OnLoad, типом элемента управления будет ASP.my_control_name_ascx, но его использование также не работает.

Почему дочерний класс не может ссылаться на правильный тип? Можно это исправить?

Спасибо!

Ответы [ 4 ]

1 голос
/ 04 апреля 2012

У меня работает следующий код:

DropDownList ddlLanguage = (DropDownList)Page.Master.FindControl("ddlLanguage");
1 голос
/ 08 июня 2010

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

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %>

Вам нужно будет добавить тег регистрации, как указано выше, в верхней части вашей дочерней страницы aspx.

Другой вариант заключается в том, что вы можете создать интерфейс для элемента управления, который предоставляет свойства или методы, к которым вы хотите получить доступ, и поместить интерфейс в app_code или в какое-либо другое глобально доступное место, а затем заставить элемент управления реализовать интерфейси приведите управление к интерфейсу.

0 голосов
/ 05 октября 2010

Не является прямым ответом на ваш вопрос, но вы можете найти директиву @MasterType полезной.

Если добавить строку типа

<%@ MasterType TypeName="ClientName.SiteName.MasterPages.SiteMaster" %>

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

Вы можете получить строку вроде:

// In Page.OnLoad:
MyControlName control = Page.Master.MyControl;

и затем откройте новое свойство на главной странице, которое обернет вызов FindControl:

// In Site.master.cs
internal MyControlName MyControl
{
    get { this.FindControl("controlID"); }
}

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

0 голосов
/ 07 июня 2010

Я так понимаю GetBaseMasterPage () это ваш собственный метод? Что произойдет, если вы попытаетесь:

MyControlName control = (MyControlName)Page.Master.FindControl("controlId");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...