老问题......但我刚刚遇到这个问题,这是谷歌上不断出现的#1帖子,所以我想添加我的答案,因为其他人在我的情况下不起作用。
这是我在常规时的做法<asp:Content
不起作用(尽管在正常使用中,答案@JayC就是你如何做到这一点):
母版页有这个ContentPlaceHolder
:
<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp:ContentPlaceHolder>
必须从用户控件动态添加一些 JavaScript。尝试使用ContentPlaceHolder
直接报这个错误:
解析器错误消息:内容控件必须是顶级控件
在内容页或引用母版的嵌套母版页中
页。
所以我想从代码隐藏中添加脚本。这是页面加载.ascx
file:
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);
}
}
UPDATE:所以事实证明我不得不在比我预期更多的地方使用它,并最终使用了一种更灵活/可读的方式。在用户控件本身中,我只是包装了 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">
,自定义用户控件会处理其余的事情,我不必在用户控件后面的代码中执行任何操作。