我有一个母版页,我的所有页面都继承了它。 对于格式化,我想在ContentPlaceHolder中放置不同页面的内容。
现在,如何将所有内容插入其中?由于我打算用数据库中的东西填充ContentPlaceHolder,我想我必须以编程方式进行填充。
如何向ContentPlace Holder添加控件? 我检查了其他answers,但我无法通过其ID访问它。
我应该从一开始就使用多个ContentPlaceHolders吗?假设我想放电影。如果只有一个包含所有图像,描述和评级,每个东西都有一个ContentPlaceHolder吗?
我对其他解决方案持开放态度,因为我没有使用ASP的经验。
答案 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)
通常发生的是
ContentPlaceHolder
s Content
区域。如果要将控件动态添加到主(或任何)页面,可以向任何现有控件添加控件。如果它不应该以任何方式包装,只需添加一个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应用程序)