2013-03-07 1 views
3

Я пытаюсь получить доступ к значению скрытого поля с моей главной страницы, установленной на моей дочерней странице aspx, но не могу получить к ней доступ к событию masterpage codebehind page_load.не может получить доступ к значению скрытого поля в главной странице в событии page_load с дочерней страницы

Ребенок страницы ASPX:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server"> 
<telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server"> 
</telerik:RadStyleSheetManager> 
<div class="center_content"> 
    <div style="text-align: left"> 
     <h2> 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
     </h2> 
    </div> 
    <div style="text-align: left"> 
     <uc1:Chart ID="Chart1" runat="server" /> 
    </div> 
    &nbsp;</div> 
    <asp:HiddenField ID="hid1" runat="server" Value="Satellite Availability % Report" /> 

Мастер-страница:

<asp:Label runat="server" ID="Label1" Style="text-align: right; font-size: xx-large; color: #808080"></asp:Label> 

Master кодовая страница позади: Здесь я хочу установить текстовое значение отчета со страницы ребенка.

protected void Page_Load(object sender, EventArgs e) 
    { 
     HiddenField hid1 = (HiddenField)MainContent.FindControl("MainContent_hid1"); 
    if (hid1 != null) 
    { 
     Label1.Text = hid1.Value; 
    }  } 
<input type="hidden" name="ctl00$MainContent$hdnRptTitle" id="MainContent_hdnRptTitle" value="Satellite Availability % Report" /> 

Для переменной hdnRptTitle нет intellisense.

Как я могу заставить это работать? Это кажется достаточно простым, но не знаю, почему это не работает ...

+0

Почему вы думаете, что вы можете получить доступ к элементу управления в контент-странице мастер-страницы? «MasterPage» используется для нескольких страниц, почему вы хотите привязать его к определенной странице, и без него он больше не будет работать. Если 'HiddenField' необходим для работы мастера, вы должны объявить его там. –

+0

Что вы предлагаете мне делать? Для каждой дочерней страницы есть другой заголовок rpt, который должен отображаться на главной странице. Как я могу это сделать? Спасибо .... – sagesky36

+0

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

ответ

1

Вы можете добавить следующий код в ваш MasterPage:

HiddenField hid1 = (HiddenField)MainContent.FindControl("hid1"); 
if (hid1 != null) 
{ 
    Label1.Text = hid1.Value; 
} 

EDIT: Убедитесь, что ваш Label на MasterPage является за пределами вашего ContentPlaceHolder, поскольку я сделал эту ошибку, когда я впервые протестировал.

Приведенный выше код должен работать, как это предусмотрено, с вашими именами управления, я не знаю, почему вы используете:

.FindControl("MainContent_hid1");

вместо

.FindControl("hid1");

+0

Это то, что я пробовал, но hid1 продолжает расти. Ознакомьтесь с обновленными изменениями, как выглядит моя страница. Не могу понять, почему он не находит контроль ..... – sagesky36

+0

Я отредактировал ответ, я думаю, что это будет Label1, который будет нулевым, как я тестировал, и имел такую ​​же проблему перед публикацией. – Tanner

+0

Нет, это не так ... Во время отладки hid1 появляется null. Следовательно, он не устанавливает значение Label1 ... Не знаю, что делать ... Я в тупик ... это должно работать ... Ярлык находится вне ContentPlaceHolder. – sagesky36

0

Почему ты думаете, что вы можете получить доступ к элементу управления на странице контента главной страницы? A MasterPage используется для нескольких страниц, почему вы хотите привязать его к определенной странице, и без него он больше не будет работать. Если HiddenField необходим для работы мастера, вы должны объявить его там.

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

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

Вы могли бы обеспечить общественную собственность в мастере, например:

public string ReportTitle 
{ 
    get { return this.LblReportTitle.Text; } 
    set { this.LblReportTitle.Text = value; } 
} 

и в ContentPage, например, в это Page_Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // assuming the type of your master is SiteMaster 
    var master = this.Master as SiteMaster; 
    if (master != null) 
     master.ReportTitle = hdnRptTitle.Value; 
} 

Этот подход еще связывающий мастер с одним (или нескольких) его дочерних элементов, но он все равно «работает», если на странице содержимого будет использоваться другой тип-мастер. Вам также будет сообщено об ошибке компилятора, если кто-то удалит или изменит свойство.

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

1

Вы можете использовать это.
На главной странице может быть несколько conterntPlaceHolder.
использовать идентификатор, который содержит ваш hidden field в этом случае я предполагаю, что это ContentPlaceHolder1

HiddenField hid1 = (HiddenField)ContentPlaceHolder1.FindControl("hdnRptTitle"); 
    if (hid1 != null) 
    { 
    Label1.Text = hid1.Value; 
    } 

Существует аналогичный пост на so
How to access content page controls from master page in asp.net

+0

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

+0

Шекнар, спасибо. Я реализовал, но элемент управления имеет значение null. Мое скрытое поле находится внутри заполнителя Maincontent. Я отредактирую свой код, чтобы вы могли видеть, что у меня есть, и, пожалуйста, оцените и дайте мне знать, что может быть неправильным ... Большое спасибо ... – sagesky36

+0

Получил! После отладки и просмотра коллекции Controls я увидел, что имя элемента управления было «hid1» вместо «MainContent_hid1 – sagesky36

0

Вы можете ссылаться на главную страницу и получить контроль как это:

VB.Net:

Dim te As HiddenField 
Dim val As String 

te = Me.Page.Master.FindControl("hdnRptTitle") 
val = te.Value 

C#:

HiddenField te = default(HiddenField); 
string val = null; 

te = this.Page.Master.FindControl("hdnRptTitle"); 
val = te.Value; 
+0

Я думаю, что он хочет, чтобы он был противоположным (я знаю, что заголовок вопроса запутан) – Win

Смежные вопросы