今天写了一个用户控件,用户控件中引用了一个JS文件.
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<script language="javascript" type="text/javascript" src="JS/InputableDropDownList.js"></script>
<asp:TextBox ID="txtList" runat="server" Width="150px" onclick="GetDropDownList(this)" onkeyup="GetDropDownList(this)" datasource="" autocomplete="off"  pagecount="18" value_to_input=""></asp:TextBox>
<input id="hf_value" type="hidden" runat="server" style="width:0px;"/>如果不使用Updatepanel,使用起来没有问题, 但是,如果把用户控件放到updatepanel中,无论updatepanel的updatemode,childrensastriggers如何设置, 只要页面回发了一次,再将焦点放到用户控件输入框中,就会出现异常,
异常表面上看上去是页面凌乱, 在GetDropDownList中,设置debugger,会发现出现"没有可用于当前位置的源代码"如果将用户控件中的JS引用,放到页面上(aspx页面)引用,将用户控件中的引用去掉,就不会报错!然后我又单独地将页面上的JS引用放到Updatepanel内,就会再次出现一样的错误!
为什么? 如何做才能找到源文件?附: 出错后,通过查看页面的源文件,发现JS引用的代码是存在的:
 <div id="UpdatePanel1">

        <div>
            <br />
            
<script language="javascript" type="text/javascript" src="JS/InputableDropDownList.js"></script>
<input name="InputableDropDownList1$txtList" type="text" id="InputableDropDownList1_txtList" onclick="GetDropDownList(this)" onkeyup="GetDropDownList(this)" datasource="" autocomplete="off" pagecount="18" value_to_input="" style="width:150px;" />
<input name="InputableDropDownList1$hf_value" type="hidden" id="InputableDropDownList1_hf_value" style="width:0px;" />
            <br />            <input type="submit" name="Button1" value="Button" id="Button1" />
            <input name="TextBox1" type="text" id="TextBox1" />
        </div>

解决方案 »

  1.   

    用updatepanel之后源码中控件的ID有些会发生变化。。这个错误可能性太多了。。只能一部部调试了
      

  2.   

    不是ID的问题! 因为用户控件放在Updatepanel中,JS引用放在updatepanel之外,就不会出现问题.问题的根源是:JS引用放到updatepanel中以后,页面回发了,页面就似乎压根儿就找不到JS文件.而查看页面的源文件,JS引用的脚本还是存在的. 
      

  3.   

    UpdatePanel除了方便 没啥优点 曾经因为里面的脚本问题 调死人 
      

  4.   

    我不是为了用它,而是兼容性测试! 而我们项目组又对updatepanel使用得比较多。
    一测试才发现这问题
      

  5.   

    使用updatepanel的,面试时直接out.
      

  6.   

    js末尾加入此代码才能在updatepanel调用if (typeof (sys) != "undefined") { sys.application.notifyscriptloaded();} 
      

  7.   

    不要在页面里添加Script
    在后台使用,可以在OnInit方法或者其他方法里ScriptManager.RegisterClientScriptInclude(Page, typeof(WebUserControl), "WebUserControl", ResolveUrl("JS/InputableDropDownList.js"));
      

  8.   


    用UpdatePanel的页面上一定有个ScriptManager对吧,看下MS对ScriptManager的介绍有这么一条:
    Microsoft AJAX Library 的客户端脚本功能和要发送到浏览器的任何自定义脚本。
    再要详细的看下MSDN,ScriptManager有多个方法用来在使用UpdatePanel的情况下向前端页面定义脚本。
      

  9.   


    我的用户控件里,使用了大量的javascript脚本。 不放在JS里的话,会直接显示在使用用户控件的页面上。造成页面很大! 项目内用的控件,不公开用。哈。。 所以不担心路径
      

  10.   

    后台OnInit里加上
    ScriptManager.RegisterClientScriptInclude(Page, typeof(WebUserControl), "WebUserControl", ResolveUrl("JS/InputableDropDownList.js"));这个试过了吗?
      

  11.   


    在页面的ONinit事件里?还是用户控件的ONINIT事件里?