【问题标题】:Access body element from content page via a nested master page通过嵌套母版页从内容页面访问正文元素
【发布时间】:2016-03-14 16:23:38
【问题描述】:

我要做的就是从内容页面的代码隐藏中访问<body> 元素并向其添加类名。

我有一个包含<body> 元素的顶级母版页。然后我有一个嵌套的母版页,它是内容页的母版页。从内容页面后面的代码中,我想向 body 元素添加一个类名。就是这样。

我在顶级master里有这个:

<body id="bodyNode" runat="server">

我将此添加到内容页面的代码隐藏中:

Master.bodyNode.Attributes.add("class", "home-page");

我收到一条消息:

System.Web.UI.MasterPage' 不包含“bodyNode”的定义

如果我将此添加到 aspx 内容页面:

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

然后消息变为:

bodyNode 由于其保护级别而无法访问

请告知,我已经浪费了大约 2 个小时来做​​一些感觉应该非常简单的事情:(

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    一旦你为你的 body 节点设置了 runat="server",你必须使用 HTMLControls 命名空间来访问它。试试这个。

    public void Page_Load(Object sender, EventArgs e)
    { 
    //Inject onload and unload
    HtmlGenericControl body = (HtmlGenericControl)Master.FindControl("bodyNode");
    body.Attributes.Add("class", "home-page");   
    }
    

    编辑
    您的问题是您有嵌套的母版页。

    由于“body”标签在您的顶级母版页中,Master.FindControl() 将不起作用,因为它正在嵌套母版页中查找。

    您需要做的是使用Master.Master.FindControl(),或者递归地遍历您的母版页,直到Master.Master 为空(这样您就知道您在顶级母版页),然后调用FindControl()关于那个。

    【讨论】:

    • 您还可以设置一个公共属性,让您无需在所有内容页面上剪切和粘贴此代码即可访问正文
    • 谢谢,我添加了这个,但现在异常已更改为:“对象引用未设置为对象的实例。”生成它的行是'body.Attributes.Add("class", "home-page");'虽然实际文件中没有红色下划线表示问题..?
    • 这意味着“body”为空。通过在上面放置一个断点来检查上面的行是否正确找到它。你可能会发现它不是。尝试在立即模式下运行 Master.FindControl("bodyNode") (一旦你命中断点),看看它返回什么,我会尽快测试并重新回答
    • 这适用于 Lerxst,但我在母版页中有一个元素,我想在除一个之外的所有页面中显示它,所以当我添加这个时: Master.FindControl("headerbanner").Visible =错误的;它不会工作,因为编译器会先解析内容页然后解析母版页,并且在母版页中我设置了 Visible True
    • 我知道它在@Lerxst 的第一句话中明确说明了'一旦你为你的身体节点设置了 runat="server"',我忽略了这一点并且得到了相同的对象引用错误丹威尔曼。一旦它在那里,> 名称也作为 这就像一个魅力。谢谢@Lerxst!
    【解决方案2】:

    我将在母版页后面的代码中添加一个公共属性,以允许访问作为母版页一部分的正文标记。然后从内容页面调用该属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2011-01-10
      • 2011-08-19
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多