2010-05-19 47 views
5

我想要做的就是从内容页面的代码隐藏中访问<body>元素,并为其添加类名称。通过嵌套主页从内容页面访问主体元素

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

我有这样的顶级高手:

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

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

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

我也得到一个消息:

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

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

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

,该消息将会变为:

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

请指教,我浪费了2小时,感觉像是应该很简单的事情:(

回答

11

一旦你为你的身体节点设置了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()

+0

您还可以设置一个公共属性,让您访问身体,而无需剪切和粘贴此代码在您的所有内容页 – 2010-05-19 14:12:40

+0

谢谢,我添加了这个,但异常现在已更改为: '你调用的对象是空的。'生成此行的行是'body.Attributes.Add(“class”,“home-page”);'虽然在实际文件中没有用红色下划线表示问题..? – danwellman 2010-05-19 14:28:09

+0

这意味着“body”为空。通过在它后面放置一个断点来检查上面的行是否正确找到它。你可能会发现它不是。 尝试在即时模式下运行Master.FindControl(“bodyNode”)(一旦你点击断点)并查看它返回的内容,我将尽快测试并重新回答 – 2010-05-19 15:03:14

0

我会将一个公共属性添加到母版页后面的代码中,该代码将允许访问属于母版页一部分的主体标签。然后从内容页面调用该属性。

+0

这听起来像它可以工作。不知道该怎么做,虽然... – danwellman 2010-05-19 14:30:49