【问题标题】:How to programmatically add stuff to contentPlaceHolder?如何以编程方式向 contentPlaceHolder 添加内容?
【发布时间】:2012-05-07 23:16:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    当普通的<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);
        }
    }
    

    我实际上把这段代码放在一个自定义用户控件中,我只是让我的常规用户控件继承自自定义用户控件,所以一旦我用 &lt;div id="_jsDiv" runat="server"&gt; 包装了 javascript/etc,自定义用户控件就会处理其余的,我不必在用户控件后面的代码中做任何事情。

    【讨论】:

    • 这非常有效。它甚至可以扩展为包含占位符名称的控制参数。当我需要以编程方式将 javascript 文件放置在特定序列/位置而不是标题中时,我使用了此解决方案。
    【解决方案2】:

    通常情况是

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

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

    【讨论】:

    • 对不起,这并不能真正解决我的问题。我需要一些代码以编程方式将一些文本放入该内容区域,因为我无法从网页的 CodeBehind 访问它。我有 default.aspx 页面和 ID = content1 的 ContentPlaceHolder。在 default.aspx.cs 我无法“看到” content1。
    • 我明白了。您是否有任何理由不能在页面的 Content 区域中放置占位符?你当然可以添加一些东西:
    • 例如:Label lbl =new Label(); lbl.Text="something"; placeHolder.Controls.Add(lbl);
    • 不,我可以使用占位符。应该没问题,我猜。但现在我意识到我的问题远比这复杂。我应该问一个不同的问题吗?我想根据我的查询链接在该区域集成不同的内容。类似于在 PHP 中使用 import 的东西。例如,如果我有 ?category=1 则在该区域中将是类别描述和产品,或者如果我有 ?product=xx 那么在该区域中将是图像、描述和价格。最简单的方法是什么?
    • 我很想将要在其中显示的内容类型分离为单独的用户控件,然后根据需要动态加载适当的控件(例如,您的页面的 Page_Init 方法,@987654327 @ 然后设置控件并将其添加到占位符的 Controls 集合中)但这可能会有点麻烦,具体取决于您的项目设置方式。仅仅拥有单独的页面可能更容易,每个页面都做它需要做的事情,然后将它们 UrRewrite 到 IIS7 中的相同基本 Url(如果使用它)。你有很多选择。
    【解决方案3】:

    我喜欢这个

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        相关资源
        最近更新 更多