在ASP.Net网站中包含带有自定义控件的Javascript

时间:2009-10-20 17:08:23

标签: asp.net javascript custom-controls

我有一个自定义日期控件,它本质上是一个文本框和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,我再次获得相同的结果。控件总是在默认页面上工作,但从不在第二页上,即使我可以告诉脚本包含在控件中。

有什么想法吗?

2 个答案:

答案 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文件实际上从未加载。这就是你的事件处理程序未定义的原因。

最简单的方法是使用绝对路径。由于您正在使用用户控件,因此可以轻松地在应用程序根文件夹之前添加。