当前位置:编程学习 > C#/ASP.NET >>

ajax 文本框输入自动提示 undefined

一个页面用了两个 AutoCompleteExtender 给两个textboz做输入提示,两个方法放在一个asmx内,
显示的时候name可以正常显示,但是第二个(ID)却显示uddefined.....
我跟踪了一下,发现return ids.ToArray()这里返回的数据室正常的,但不知道为什么显示的结果却不正常,
请高手帮找下原因...谢谢了
下面是后台代码:
public class AutoCompleteName : System.Web.Services.WebService
    {
        [WebMethod]
        public string[] GetName(string prefixText,int count)
        {
            List<string> names = new List<string>(count);
            return names.ToArray();
        }
        [WebMethod]
        public string[] GetID(string prefixText, int count)
        {
            List<string> ids = new List<string>(count);       
             return ids.ToArray();
        }
    }

前台代码:
<td>
                    <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
                    <asp:AutoCompleteExtender ID="AutoCompleteExtenderName" runat="server" TargetControlID="txtName"
                        ServicePath="AutoComplete.asmx" ServiceMethod="GetName" MinimumPrefixLength="1"
                        EnableCaching="true" CompletionInterval="1000" CompletionSetCount="20">
                    </asp:AutoCompleteExtender>
                </td>
                <td>
                    <asp:Label ID="Label5" runat="server" Text="ID"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txtID" runat="server"></asp:TextBox>
                    <asp:AutoCompleteExtender ID="AutoCompleteExtenderID" runat="server" TargetControlID="txtID"
                        ServicePath="AutoComplete.asmx" ServiceMethod="GetID" MinimumPrefixLength="4"
                        EnableCaching="true" CompletionInterval="1000" CompletionSetCount="20">
                    </asp:AutoCompleteExtender>
                </td>
--------------------编程问答-------------------- 参考下。 --------------------编程问答-------------------- 大家都忙什么呢?期待高手~~ --------------------编程问答-------------------- 郁闷啊,我的问题没几分钟就被淹没了,现在的版本怎么样将帖子提前呢? --------------------编程问答-------------------- 那就用两个webservers测试下 --------------------编程问答--------------------
引用 4 楼 stromboy007 的回复:
那就用两个webservers测试下

两个也不行,提示一样的,undefined --------------------编程问答-------------------- 在web service里面设置断点调试下,应该是整个问题,
要不就是AutoCompleteExtender 里面是有些设置错误
耐心点就可以了哦 --------------------编程问答-------------------- asp:Label ID="Label5" runat="server" Text="ID"> ,
这里的ID="Label5", 而在你下面的autocomplete控件中的targetcontrolid="txtID" ,
粗心了吧????呵呵 --------------------编程问答-------------------- <asp:ScriptManager ID="ScriptManager1" runat="server">       
    </asp:ScriptManager>     
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <cc1:AutoCompleteExtender ID="AutoCompleteExtender1" MinimumPrefixLength="2"
                  CompletionSetCount="8"  TargetControlID = "TextBox1"   ServicePath="AutoComplete.asmx" ServiceMethod="GetID" runat="server">
                </cc1:AutoCompleteExtender>
 ids中值是什么 --------------------编程问答-------------------- 不好意思,上面那个回复是我看错了。
会不会是因为asp.net ajax本身调用Web Services的时候同时去执行这两个方法,出现了time out的情况。这应该是asp.net ajax的bug, 也就是那个Batch Call的问题。试试这个:
Sys.Net.WebServiceProxy.retryOnFailure = 
    function(result, userContext, methodName, retryParams, onFailure)
{
    if( result.get_timedOut() )
    {
        if( typeof retryParams != "undefined" )
        {
            debug.trace("Retry: " + methodName);
            Sys.Net.WebServiceProxy.original_invoke.apply(this, retryParams );
        }
        else
        {
            if( onFailure ) onFailure(result, userContext, methodName);
        }
    }
    else
    {
        if( onFailure ) onFailure(result, userContext, methodName);
    }
}

Sys.Net.WebServiceProxy.original_invoke = Sys.Net.WebServiceProxy.invoke;
Sys.Net.WebServiceProxy.invoke = 
    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet, 
        params, onSuccess, onFailure, userContext, timeout)
{   
    var retryParams = [ servicePath, methodName, useGet, params, 
        onSuccess, onFailure, userContext, timeout ];
    
    // Call original invoke but with a new onFailure

    // handler which does the auto retry

    var newOnFailure = Function.createDelegate( this, 
        function(result, userContext, methodName) 
        { 
            Sys.Net.WebServiceProxy.retryOnFailure(result, userContext, 
                methodName, retryParams, onFailure); 
        } );
        
    Sys.Net.WebServiceProxy.original_invoke(servicePath, methodName, useGet, 
        params, onSuccess, newOnFailure, userContext, timeout);
}
--------------------编程问答--------------------
ids 返回的是一个string数组 "123-456789"......
引用 8 楼 wuyq11 的回复:
<asp:ScriptManager ID="ScriptManager1" runat="server">     
    </asp:ScriptManager>   
                <asp:TextBox ID="TextBox1" runat="server"> </asp:TextBox>
                <cc1:AutoCompleteExtender ID="AutoCompleteExtender1" MinimumPrefixLength="2"
                  CompletionSetCount="8"  TargetControlID = "TextBox1"  ServicePath="AutoComplete.asmx" ServiceMethod="GetID" runat="server">
                </cc1:AutoCompleteExtender>
ids中值是什么
--------------------编程问答-------------------- 老兄,你写的这个很高深,我看不明白....写在什么地方的呢?
引用 9 楼 dujingjing1230 的回复:
不好意思,上面那个回复是我看错了。
会不会是因为asp.net ajax本身调用Web Services的时候同时去执行这两个方法,出现了time out的情况。这应该是asp.net ajax的bug, 也就是那个Batch Call的问题。试试这个:
C# codeSys.Net.WebServiceProxy.retryOnFailure= 
    function(result, userContext, methodName, retryParams, onFailure)
{if( result.get_timedOut() )
    {if(typeof retryParams!="undefined" )
        {
            debug.trace("Retry:"+ methodName);
            Sys.Net.WebServiceProxy.original_invoke.apply(this, retryParams );
        }else
        {if( onFailure ) onFailure(result, userContext, methodName);
        }
    }else
    {if( onFailure ) onFailure(result, userContext, methodName);
    }
}

Sys.Net.WebServiceProxy.original_invoke= Sys.Net.WebServiceProxy.invoke;
Sys.Net.WebServiceProxy.invoke= 
    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet,params, onSuccess, onFailure, userContext, timeout)
{   
    var retryParams= [ servicePath, methodName, useGet,params, 
        onSuccess, onFailure, userContext, timeout ];// Call original invoke but with a new onFailure// handler which does the auto retry
    var newOnFailure= Function.createDelegate(this, 
        function(result, userContext, methodName) 
        { 
            Sys.Net.WebServiceProxy.retryOnFailure(result, userContext, 
                methodName, retryParams, onFailure); 
        } );
        
    Sys.Net.WebServiceProxy.original_invoke(servicePath, methodName, useGet,params, onSuccess, newOnFailure, userContext, timeout);
}
--------------------编程问答--------------------
引用 6 楼 xifenfei 的回复:
在web service里面设置断点调试下,应该是整个问题,
要不就是AutoCompleteExtender 里面是有些设置错误
耐心点就可以了哦


我设置看过了,一直到return返回值都是正确的,但页面显示的时候就undefined了.. --------------------编程问答--------------------
引用 11 楼 tmxk505 的回复:
老兄,你写的这个很高深,我看不明白....写在什么地方的呢?
引用 9 楼 dujingjing1230 的回复:
不好意思,上面那个回复是我看错了。
会不会是因为asp.net ajax本身调用Web Services的时候同时去执行这两个方法,出现了time out的情况。这应该是asp.net ajax的bug, 也就是那个Batch Call的问题。试试这个:
C# codeSys.Net.WebServiceProxy.retryOnFailure=
    function(result, userContext, methodName, retryParams, onFailure)
{if( result.get_timedOut() )
    {if(typeof retryParams!="undefined" )
        {
            debug.trace("Retry:"+ methodName);
            Sys.Net.WebServiceProxy.original_invoke.apply(this, retryParams );
        }else
        {if( onFailure ) onFailure(result, userContext, methodName);
        }
    }else
    {if( onFailure ) onFailure(result, userContext, methodName);
    }
}

Sys.Net.WebServiceProxy.original_invoke= Sys.Net.WebServiceProxy.invoke;
Sys.Net.WebServiceProxy.invoke=
    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet,params, onSuccess, onFailure, userContext, timeout)

    var retryParams= [ servicePath, methodName, useGet,params,
        onSuccess, onFailure, userContext, timeout ];// Call original invoke but with a new onFailure// handler which does the auto retry
    var newOnFailure= Function.createDelegate(this,
        function(result, userContext, methodName)
        {
            Sys.Net.WebServiceProxy.retryOnFailure(result, userContext,
                methodName, retryParams, onFailure);
        } );
       
    Sys.Net.WebServiceProxy.original_invoke(servicePath, methodName, useGet,params, onSuccess, newOnFailure, userContext, timeout);
}

  ASP.NET的ajax有一种是我上面说的那个,那个需要大量数据的加载和页面刷新才会出现这个bug,但是你的情况是不是因为你返回的是个数字,你试试加上个字符,或者是把数字转换为字符应该就解决掉这个Undefined的问题了。 --------------------编程问答-------------------- [WebMethod] 
        public object GetName(string prefixText,int count) 
        { 
            return  new List <string>(count); 
        }  --------------------编程问答-------------------- 谢谢回复啊~~
我试了一下,如果返回的是字符串比如:"abcd....."是可以显示的,如果是数字转成字符串:"1234-56789"
就不能显示......但是如果我在返回的数字字符串钱加个字母,比如:"1234-56789"变成:"a1234-56789"就可以正常显示了,不知道是什么原因....

引用 13 楼 dujingjing1230 的回复:
引用 11 楼 tmxk505 的回复:
老兄,你写的这个很高深,我看不明白....写在什么地方的呢?
引用 9 楼 dujingjing1230 的回复:
不好意思,上面那个回复是我看错了。
会不会是因为asp.net ajax本身调用Web Services的时候同时去执行这两个方法,出现了time out的情况。这应该是asp.net ajax的bug, 也就是那个Batch Call的问题。试试这个:
C# codeSys.Net.WebServiceProxy.retryOnFailure=
    function(result, userContext, methodName, retryParams, onFailure)
{if( result.get_timedOut() )
    {if(typeof retryParams!="undefined" )
        {
            debug.trace("Retry:"+ methodName);
            Sys.Net.WebServiceProxy.original_invoke.apply(this, retryParams );
        }else
        {if( onFailure ) onFailure(result, userContext, methodName);
        }
    }else
    {if( onFailure ) onFailure(result, userContext, methodName);
    }
}

Sys.Net.WebServiceProxy.original_invoke= Sys.Net.WebServiceProxy.invoke;
Sys.Net.WebServiceProxy.invoke=
    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet,params, onSuccess, onFailure, userContext, timeout)

    var retryParams= [ servicePath, methodName, useGet,params,
        onSuccess, onFailure, userContext, timeout ];// Call original invoke but with a new onFailure// handler which does the auto retry
    var newOnFailure= Function.createDelegate(this,
        function(result, userContext, methodName)
        {
            Sys.Net.WebServiceProxy.retryOnFailure(result, userContext,
                methodName, retryParams, onFailure);
        } );
       
    Sys.Net.WebServiceProxy.original_invoke(servicePath, methodName, useGet,params, onSuccess, newOnFailure, userContext, timeout);
}


  ASP.NET的ajax有一种是我上面说的那个,那个需要大量数据的加载和页面刷新才会出现这个bug,但是你的情况是不是因为你返回的是个数字,你试试加上个字符,或者是把数字转换为字符应该就解决掉这个Undefined的问题了。
--------------------编程问答-------------------- 还是未解决 --------------------编程问答-------------------- 这个问题很麻烦....前段时间没事情耽搁下来了把它忘了,重拾..寻求解决方案 --------------------编程问答-------------------- 我试了一下,如果返回的是字符串比如:"abcd....."是可以显示的,如果是数字转成字符串:"1234-56789"
就不能显示......但是如果我在返回的数字字符串钱加个字母,比如:"1234-56789"变成:"a1234-56789"就可以正常显示了,不知道是什么原因....

在显示到页面之前的最后一步的数据源比如是"37000" "3A000" "3A001" "3B000"...,但是到了前台显示的时候变成"undefined","3A000" "3A001" ...不能显示纯数字,哎。。。
求高手啊 --------------------编程问答-------------------- 菜鸟帮顶~~~
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,