7

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

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

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

  2. 我应该从一开始就使用多个 ContentPlaceHolders 吗?假设我想放电影。是否应该只有一个包含所有图像、描述和评级,或者每件事一个 ContentPlaceHolder?

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

4

4 回答 4

12

老问题......但我刚刚遇到了这个问题,这是谷歌上不断出现的 #1 帖子,所以我想我会添加我的答案,因为其他人在我的情况下不起作用。

<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);
    }
}

更新:所以事实证明,我不得不在比预期更多的地方使用它,并最终使用了一种更灵活/可读性更高的方式。在用户控件本身中,我只是将 javascript 和其他任何需要使用常规移动的div.

<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);
    }
}

我实际上将此代码放在自定义用户控件中,我只是让我的常规用户控件继承自自定义用户控件,所以一旦我用 a 包装 javascript/etc <div id="_jsDiv" runat="server">,自定义用户控件会处理其余的事情,而我不会不必在用户控件后面的代码中做任何事情。

于 2013-10-08T19:30:30.160 回答
2

通常发生的是

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

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

于 2012-05-07T23:30:03.777 回答
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;
于 2012-07-06T02:20:06.137 回答
0

如果内容页和母版页的命名空间不同,则内容页控件无法在内容页的代码隐藏中访问。

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

于 2016-12-17T04:29:59.177 回答