如何以编程方式将内容添加到contentPlaceHolder?

我有一个母版页,我的所有页面都inheritance了它。 对于格式化,我想在ContentPlaceHolder中放置不同页面的内容。

现在,我该如何插入所有内容? 由于我打算用数据库中的东西填充ContentPlaceHolder,我想我必须以编程方式进行填充。

  1. 如何向ContentPlace Holder添加控件? 我检查了其他答案 ,但我无法通过其ID访问它。

  2. 我应该从开始使用多个ContentPlaceHolders吗? 假设我想放电影。 如果只有一个包含所有图像,描述和评级,那么每个东西都要有一个ContentPlaceHolder吗?

我对其他解决方案持开放态度,因为我没有使用ASP的经验。

老问题……但是我刚刚遇到了这个问题,这是第一个一直在Google上发布的post,所以我想补充一下我的答案,因为其他人在我的案例中没有用。

这是我在常规不起作用时的方式(虽然在正常使用中,答案是@JayC就是这样做的):

MasterPage有这个ContentPlaceHolder

  

必须从用户控件动态添加一些JavaScript。 尝试直接使用ContentPlaceHolder会出现此错误:

分析器错误消息:内容控件必须是内容页面中的顶级控件或引用母版页的嵌套母版页。

所以我想从代码隐藏中添加脚本。 这是.ascx文件的页面加载:

 protected void Page_Load(object sender, EventArgs e) { ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; if (c != null) { LiteralControl l = new LiteralControl(); l.Text=""; c.Controls.Add(l); } } 

更新:事实certificate,我必须在比预期更多的地方使用它,并最终使用更灵活/可读的方式。 在用户控件本身,我只是包装了javascript以及需要使用常规div移动的任何其他内容。

 
$(document).ready(function() { //js stuff }); Other server controls or HTML junk

然后后面的代码将找到div,然后将其移动到ContentPlaceHolder

 protected void Page_Load(object sender, EventArgs e) { ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; HtmlGenericCOntrol jsDiv = this.FindControl("_jsDiv") as HtmlGenericControl; if (c != null && jsDiv != null) { c.Controls.Add(jsDiv); } } 

我实际上把这个代码放在一个自定义用户控件中,我只是让我的常规用户控件inheritance自定义用户控件,所以一旦我用

包装javascript / etc,自定义用户控件负责其余部分,我不必在用户控件后面的代码中做任何事情。

通常发生的是

  1. 使用正确的html和ContentPlaceHolder设置母版页
  2. 您可以根据该母版页创建页面。 如果您使用Visual Studio,并告诉它基于现有母版页创建新页面,它将为您添加Content区域。
  3. 您将内容添加到新创建的页面中的内容区域。

如果要将控件动态添加到主(或任何)页面,可以向任何现有控件添加控件。 如果它不应该以任何方式包装,只需添加一个Placeholder (它是一个asp.net控件)。

我确实喜欢这个

    

这进入了代码背后:

 string stuff = @""; jsstuff.Text = stuff; 

如果内容页面和母版页面的名称空间不相同,则内容页面控件无法在内容页面中的Codebehind中访问。

另外,检查您的设计器文件。 如果控件未在设计器文件中列出,则删除该文件并重新创建(project-> convert to web application)