老问题......但我刚刚遇到了这个问题,这是谷歌上不断出现的 #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">
,自定义用户控件会处理其余的事情,而我不会不必在用户控件后面的代码中做任何事情。