老问题......但我刚刚遇到了这个问题,这是在 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);
}
}
我实际上把这段代码放在一个自定义用户控件中,我只是让我的常规用户控件继承自自定义用户控件,所以一旦我用 <div id="_jsDiv" runat="server"> 包装了 javascript/etc,自定义用户控件就会处理其余的,我不必在用户控件后面的代码中做任何事情。