我有一个自定义日期控件,它本质上是一个文本框和ajaxToolKit calendarExtender。我想在控件中包含Javascript,无论控件在哪个页面上,它都能正常工作。该控件称为DateControl.ascx
所以我有两个Javascript函数,dateEditor_OnShown和dateEditor_OnHiding。他们在DateControl.ascx的页面加载中被绑定了...
CalendarExtender.OnClientShown = "dateEditor_OnShown";
CalendarExtender.OnClientHiding = "dateEditor_OnHiding";
DateControl工具用于两个单独的页面。如果我将直接的Javascript直接放入DateControl的HTML中,它只能在默认页面上运行,但在我用控件加载下一页时会崩溃。错误是js运行时错误'dateEditor_OnHiding'未定义。
如果我尝试通过我的DateControl的html链接到Javascript文件......
<script type="text/javascript" src="../JavaScript/IE6CalendarExtenderFix.js"></script>
...而不是直接在页面中使用Javascript,它会立即崩溃并出现相同的错误。我应该注意到js的路径是正确的。
我真正能够让它发挥作用的唯一方法是,如果我链接到每个使用该控件的页面上的javascript。
更新:我觉得有必要澄清一下。建议的解决方案非常受欢迎,但要么我不理解,要么因为某种原因(很可能是前者)不能在我的情况下工作。
所以,这基本上就是我的控件的样子......
<div id="CustomDateControl" style="<%# ControlStyle %>">
<div id="TextBox" style="display:inline; white-space:nowrap;">
<asp:TextBox runat="server" ID="txtCalender" Style="<%# TextBoxStyle %>" />
</div>
<div id="Calendar" runat="server">
<ajaxToolkit:CalendarExtender
runat="server"
ID="CalendarExtender"
Format="MM/dd/yyyy"
TargetControlID="txtCalender"
PopupButtonID="CalenderImage" />
</div>
</div>
在aspx页面中,使用确切的代码,如果我将精确的javascript放在脚本标记中,那么页面看起来就像这样......
<script type="text/javascript">
function dateEditor_OnShown(dateControl, emptyEventArgs) {
...
}
function dateEditor_OnHiding(dateControl, emptyEventArgs) {
...
}
</script>
<div id="CustomDateControl" style="<%# ControlStyle %>">
<div id="TextBox" style="display:inline; white-space:nowrap;">
<asp:TextBox runat="server" ID="txtCalender" Style="<%# TextBoxStyle %>" />
</div>
<div id="Calendar" runat="server">
<ajaxToolkit:CalendarExtender
runat="server"
ID="CalendarExtender"
Format="MM/dd/yyyy"
TargetControlID="txtCalender"
PopupButtonID="CalenderImage" />
</div>
</div>
当访问第二页(不是第一页,即默认页面)中的控件时,仍然会崩溃,说“dateEditor_OnHiding”未定义。现在,如果我使用相同路径链接到具有相同代码的js文件,如下所示,我仍然得到相同的结果。
另外,如果按照下面的建议,我重写OnPreRender并运行RegisterClientScriptInclude,我再次获得相同的结果。控件总是在默认页面上工作,但从不在第二页上,即使我可以告诉脚本包含在控件中。
有什么想法吗?
答案 0 :(得分:2)
在用户控件中添加以下代码。
protected override void OnPreRender(EventArgs e)
{
Page.ClientScript.RegisterClientScriptInclude("DateControl", this.ResolveClientUrl("~/JavaScript/IE6CalendarExtenderFix.js"));
base.OnPreRender(e);
}
答案 1 :(得分:1)
您可能遇到JS文件的相对路径问题。您正在指定自定义控件的相对路径。您应该编写用户控件。无论如何。您的JS文件是自定义控件的相对路径,但不是相对于包含页面,因此您的JS文件实际上从未加载。这就是你的事件处理程序未定义的原因。
最简单的方法是使用绝对路径。由于您正在使用用户控件,因此可以轻松地在应用程序根文件夹之前添加。