Как получить доступ к элементам управления внутри вложенной главной страницы? почему он ведет себя не так, как контентные страницы?
Есть ли разница между этими двумя сценариями:
(1) Доступ к свойству на главной странице от обычного ребенка
(2) Доступ к свойству на главной странице с вложенной главной страницы
Я попытался получить доступ к текстовому полю на главной странице со страницы содержимого следующим образом:
TextBox a;
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
defaultTextbox.Text = a.Text; // defaultTextBox is a textbox control inside default.aspx
это работает, но потом, когда я применил тот же метод на вложенной главной странице:
TextBox a;
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
myTextBox.Text = a.Text; // myTextBox is a textbox control inside child.master
это не работает, я что-то упустил? Я вызываю оба кода в обработчике regulare page_load...
Я также заметил, что я не могу установить значение текстового поля внутри вложенной главной страницы из кода позади, там определенно что-то отсутствует, что это? Чтобы пролить свет на эту проблему, вот пример:
Вложенная мастер-страница:
<%@ Master Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="false" CodeFile="MasterPage2.master.cs" Inherits="MasterPage2" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:textbox id="tx2" runat="server" text="this is two"></asp:textbox>
<asp:contentplaceholder id="newstuff" runat="server"></asp:contentplaceholder>
</asp:Content>
Код позади:
Response.Wrote(tx2.Text);
Я НИЧЕГО не понимаю, почему что я пропустил? обратите внимание, что я также попробовал рекурсивный поиск:
String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text;
еще ничего
4 ответа
Я прочитал несколько вещей здесь: http://www.odetocode.com/Articles/450.aspx и обнаружил, что вложенная страница в середине никогда не вызывает Page_Load! вместо этого он запускает событие загрузки, которое вы можете перехватить, чтобы установить любые поля, поэтому ответ был: на вложенной странице сделайте следующее:
protected override void OnLoad(EventArgs e)
{
myTextBox.Text = "anything";
base.OnLoad(e);
}
ContentPlaceHolder cp = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
//base content place holder id
Label objLabel3 = (Label)cp.FindControl("lblNested");
//lblNested is id in nested master page
Это должно работать без проблем, поэтому что-то еще должно быть не так. Я только что попробовал это в простом тестовом проекте, и у меня нет проблем с поиском элемента управления на главной странице в обоих случаях.
Я бы проверил (еще раз), если вы ссылаетесь на правильную главную страницу внутри вашей вложенной главной страницы. Также вы можете проверить тип времени выполнения Master
свойство внутри вашей вложенной главной страницы. Это должен быть тип вашей главной страницы.
РЕДАКТИРОВАТЬ: Я думал, что проблема была в том, чтобы найти элемент управления в корневой главной странице из вложенной главной страницы, и это должно работать без каких-либо проблем. Чтобы найти элемент управления внутри заполнителя содержимого на вложенной главной странице, взгляните на следующее сообщение на форуме.
Вы можете иметь абсолютный контроль над своим контентом как на главной странице, так и на вложенной странице со своей страницы контента, используя директивы:
<%@ MasterType VirtualPath="your_master.master" %>
<%@ Reference VirtualPath="~/your_master.master" %>
Смотрите отличную статью от К. Скотта Аллена в Оде Коду