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

时间:2012-05-07 23:16:53

标签: c# asp.net master-pages contentplaceholder

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

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

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

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

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

4 个答案:

答案 0 :(得分:12)

老问题......但是我刚刚遇到了这个问题,这是第一篇不断出现在谷歌上的帖子,所以我想补充一下,因为其他人在我的案例中没有用。

以下是我在常规<asp:Content无效时的方法(虽然在正常使用中,答案是@JayC就是这样做的):

MasterPage有ContentPlaceHolder

<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp: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="<script type=\"text/javascript\">$(document).ready(function () {js stuff;});</script>";
        c.Controls.Add(l);
    }
}

更新:所以事实证明我必须在比预期更多的地方使用它,最后使用的方式更加灵活/可读。在用户控件本身中,我只是使用常规div包装了javascript和其他需要移动的内容。

<div id="_jsDiv" runat="server">
    $(document).ready(function() {
         //js stuff
    });
    Other server controls or HTML junk
</div>

然后后面的代码会找到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);
    }
}

我实际上将此代码放在自定义用户控件中,并且我只是从常规用户控件继承我的常规用户控件,所以一旦我用<div id="_jsDiv" runat="server">包装javascript / etc,自定义用户控件需要关心其余部分,我不必在用户控件后面的代码中做任何事情。

答案 1 :(得分:2)

通常发生的是

  1. 使用正确的html和ContentPlaceHolder s
  2. 设置母版页
  3. 您根据该母版页创建页面。如果您使用Visual Studio,并告诉它基于现有母版页面创建新页面,它将为您添加Content区域。
  4. 您将内容添加到新创建的页面中的内容区域。
  5. 如果要将控件动态添加到主(或任何)页面,可以向任何现有控件添加控件。如果它不应该以任何方式包装,只需添加一个Placeholder(它是一个asp.net控件)。

答案 2 :(得分:1)

我确实喜欢这个

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<asp:Literal ID="jsstuff" runat="server"></asp:Literal>
</asp:Content>

这进入了代码背后:

string stuff =  @"<script type=""text/javascript"">
                                        var searchBox = 0;
                                         var currentCountry = '';
                                         </script>";
                    jsstuff.Text = stuff;

答案 3 :(得分:0)

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

另外,检查您的设计器文件。如果控件未在设计器文件中列出,则删除该文件并重新创建(project-&gt;转换为Web应用程序)