如何从子页面控制ASP.NET母版页上的元素

15

我在我的asp.net网站上有几个页面,我想关闭母版页上的一个控件。有没有一种方法可以从子页面与母版页通信?

5个回答

21

最简单的方式是在母版页上设置一个属性,当调用该属性时,可以处理开/关功能。然后在你的子页面中设置MasterType指令来获取一个强类型引用到你的母版页,以避免需要强制转换。

你的子页面应该有:

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

要调用母版页的属性:

Master.MyLabel = false; // or true

因此,在您的主分支上,您可以有:

public bool MyLabel
{
    get
    {
        return masterLabel.Enabled;
    }
    set
    {
        masterLabel.Enabled = value;
    }
}

不错。你可以进入.designer.cs文件并将控件的作用域更改为public,然后在页面逻辑中就可以使用所有属性了。此外,如果要公开一个属性,最好使用CamelCase,pascalCase是用于私有字段的。 :) - Mark Dickinson
@Mark:好信息!我同意关于驼峰命名法的问题,之前漏掉了。现在已经修复了。 - Ahmad Mageed
3
@Mark:最好不要暴露主页面控件。如果主页面布局更改会怎样呢?只需公开属性、方法或事件即可。 - John Saunders
+1 花了几个小时查找 <%@ MasterType VirtualPath="~/Site1.Master" %>。谢谢您先生,您得到了我的投票 =) - Michel Ayres
1
@MarkDickinson 您可能在上面的评论中混淆了camelCase和PascalCase。请参阅大写风格 - JW Lim
显示剩余3条评论

10

你需要在页面标记中使用MasterType指令。

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

那么,您将能够使用

Page.Master

来访问页面母版页的任何公共属性。

this.Master.PropertyIWantToIntefereWith...
希望这可以帮到您。

我一直通过将Page对象转换来实现这个... 这听起来好多了!谢谢! - CodeRedick
我不清楚该确定TypeName值的位置,因此我使用MasterType的VirtualPath选项,这很好地解决了问题。谢谢! - Lloyd
+1 确实如此!!!我也不知道这个,它让我的应用程序中的一些导航元素使用起来更加容易! - Dillie-O

4
以下是翻译的结果:

这里举一个如何从子页面与主页面进行通信的例子。

在主页面上,创建一个属性来访问你想要控制的控件,比如一个名为 lblUser 的标签...

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

在子页面中,可以按以下示例访问刚刚创建的属性...
((MyMaster)this.Master).MyProperty = "Text changed from Sub Page";

我们之所以能够做到这一点,是因为Master只是继承了System.Web.UI.MasterPage的一个类。
而我们创建的Label.Text属性只是Master类的一个属性(在这种情况下,名称将是您当前Master Page的具体名称,例如MyMaster)。
请注意,如果没有对特定Master Page类进行转换,它将无法正常工作,这是因为您添加了一个在System.Web.UI.MasterPage中不存在的字段,即this.Master的类型,但存在于您特定的Master Class中。

0

我在寻找类似的东西,但是这个解决方案似乎对我不起作用。我有一个嵌套的母版页。这对于嵌套的母版是否有效?当我实现时,它没有识别我添加到我的主控件上的控件。


-1
this.Master.FindControl("controlid").dosomethinghere

@GenericTypeTea 这就是他们在文档中所做的。 - Zorgarath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接