How to access controls inside a nested master page? why does it behave differently from content pages?

天大地大妈咪最大 提交于 2019-12-05 23:51:33

问题


Is there a difference between these two scenarios:

(1) Accessing a property on a master page from a regular child

(2) Accessing a property on a master page from a nested master page

I tried to access a textbox in the master page from a content page like this:

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

it works, but then when I applied the same method on a nested master page:

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

this does not work, am I missing something? I call both codes inside regulare page_load handler...

I also noticed I cannot set textbox value inside the nested master page from code behind, there is definitely something im missing, what is it? To shed light on this issue, here is an example:

Nested Master Page:

<%@ 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>

Code behind:

Response.Wrote(tx2.Text);

I get NOTHING, why what did I miss? note that I also tried the recursive find control:

String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text;

still nothing


回答1:


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



回答2:


I read few things here: http://www.odetocode.com/Articles/450.aspx and found out that the nested page in the middle never calls Page_Load! instead, it fires a load event that you can catch to set whatever fields, so the answer was in: on nested page do the following:

protected override void OnLoad(EventArgs e)
    {
        myTextBox.Text = "anything";
        base.OnLoad(e);
    }



回答3:


This should work without any problems, so something else must be wrong. I just tried it inside a simple test project and I have no problems finding a control on the master page in both cases.

I would check (again) if you refer to the correct master page inside your nested master page. What you could also check is the runtime type of the Master property inside your nested master page. It should be the type of your master page.

EDIT: I thought the issue was about finding a control in the root master page from a nested master page and this should work without any problems. For finding a control inside a content placeholder in a nested master page, take a look at the following forum post.




回答4:


You can have absolute control of your content in both master page and nested page from your content page using the directives:

<%@ MasterType VirtualPath="your_master.master" %>
<%@ Reference VirtualPath="~/your_master.master" %>

See the excellent article from K. Scott Allen in Ode To Code



来源:https://stackoverflow.com/questions/874357/how-to-access-controls-inside-a-nested-master-page-why-does-it-behave-different

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!