Jquery自动完成JSON从webservice返回结果,但它不显示在下拉列表中

问题描述:

我不知道这段代码有什么问题。警报显示数据已从Web服务返回,但自动完成仍未显示数据。我使用ASP.net 2.0和谷歌的jquery链路Jquery自动完成JSON从webservice返回结果,但它不显示在下拉列表中

$(document).ready(function() { 
     $.ajax({ 
      type: "POST", 
      url: "http://localhost/WebService/Service.asmx/getlist2", 
      dataType: "json", 
      data: "{}", 


      contentType: "application/json; charset=utf-8", 
      success: function(data) { 
     alert("getlist 2"); 
      alert(data); 

       $('#project1').autocomplete({ 
        minLength: 2, 
        source: data, 

        focus: function(event, ui) { 
         $('#project1').val(ui.item.TagName); 
         alert(ui.item.TagName);//no alert is fired here 
         return false; 
        }, 
        select: function(event, ui) { 
         $('#project1').val(ui.item.TagName); 
         //$('#selectedValue').text("Selected value:" + ui.item.TagID); 
         return false; 
        } 
       }); 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert(textStatus); 
      } 
     }); 
    }); 

和web服务方法的萤火所示

[WebMethod] 
[System.Web.Script.Services.ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public List<Tag> getlist2() 
{ 
    <Tag> tagscollection = new EntitiesCollection<Tag>(); 
    ProcessTagList getlisttags = new ProcessTagList(); 

    string strtag = ""; 

    Tag tag = new Tag(); 
    tag.TagName = strtag; 
    tag.UniqueName = strtag; 
    getlisttags.OTag = tag; 
    getlisttags.Invoke(); 
    tagscollection = getlisttags.OTagsCollection; 


    ; 
     List<Tag> a = new List<Tag>(); 
    foreach(Tag tagc in tagscollection) 
    { 
     a.Add(tagc); 
    } 


    return a; 


} 

数据是:

[{ “__type” : “myproject.Common.Tag”, “标签识别”: “21abf6b1-6d45-41e5-a39b-006e621eeb22”, “UniqueName”: “的dotnet”, “变量名”: “的dotnet”, “CreatedAt”:“/日期(1255108286850 )/“}]

这个jquery代码显示了与第一个jQuery例子一起使用的webservice的下拉列表。

$("#tbAuto").autocomplete({ 
    source: function(request, response) { 
     $.ajax({ 
      url: "http://localhost/myproject/Service.asmx/getlist2", 
      data: "{}", 
      dataType: "json", 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      // dataFilter: function(data) { return data; }, 

      success: function(data) { 
       response($.map(data, function(item) { 
        return { 
         value: item.TagName 
        } 
       })) 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert(errorTrown); 
      } 
     }); 
    }, 
    minLength: 0 
}); 
+0

jquery的最后一个例子显示了从webservice返回的所有数据列表 – 2010-07-11 12:11:14

+0

谢谢大家我迟迟没有回应这个问题。其实我没有根据id,标签,值格式返回数据+ webservice是在主项目目录中。我已将Web服务放置在项目的根目录之外。原因是Urlrewrite图书馆。 – 2010-09-09 22:43:28

+0

您应该选择一个答案作为最正确的答案,只需点击其中一个复选标记:) – Mattis 2011-05-09 12:23:26

您需要将自动完成源属性设置为集合\数组。我不认为你的返回数据是一个,尽管它可能包含一个。您还需要重命名您的服务器端对象以提供标签值对。例如

{ “ID”: “1”, “标签”: “*上”, “值”: “SO”}

检查例子出来here和使用萤火虫,看看他们如何返回JSON数据。

从文档

本地数据可以是字符串的一个简单的阵列 ,或者它包含对象为 每个项目阵列中的,与任一一个 标签或属性值或两者。 标签属性显示在 建议菜单中。在 用户从 菜单中选择了某些内容后,该值将被插入到输入元素中的 。如果仅指定一个属性 ,则它将用于两个,例如 。如果您只提供 值属性,则该值也将被用作标签的 。

您可以粘贴json响应。

+0

[{“__type”:“myproject.Common.Tag”,“TagID”:“21abf6b1-6d45-41e5-a39b-006e621eeb22 ”, “UniqueName”: “的dotnet”, “变量名”: “的dotnet”, “CreatedAt”: “\ /日期(1255108286850)\ /”},{ “__类型”: “myproject.Common.Tag”, “标签识别” : “b6c3adb4-f7b5-4a2c-829c-0bde935a2689”, “UniqueName”: “基金会,ASP.NET,WCF,”, “变量名”: “基金会,ASP.NET,WCF,”, “CreatedAt”:“\ /日期(1257098846373)\ /“}] – 2010-07-11 11:42:37

+0

我在这里粘贴了两行。 – 2010-07-11 11:44:53

+3

@klusner - 你需要修改你的服务器端对象来给自动完成一个它可以使用的结构,例如我在我的标签和值属性的回答中发布的结构 – redsquare 2010-07-11 11:59:56

好的,我知道你使用的是asp.net,我的例子是基于PHP和MySQL的,但由于你的问题似乎是关于JSON格式的自动完成所期望的,所以我仍然发帖。

jQuery UI page获取最新文件。自动完成需要基础包中的UI Core,UI Widget和UI Position。您还需要自动填充小部件本身。

这个例子很适合我:

的HTML:

<div> 
    <input id="cities" /> 
</div> 

脚本部分:

(这将检索变量cities.php的城市。 php?term =)

$(function() { 
    $("#cities").autocomplete({ 
    source: "backend/cities.php", 
    minLength: 2, 
    select: function(event, ui) { 
     // perhaps do something with these? 
     region = ui.item.id; 
     country = ui.item.label; 
     city = ui.item.value; 
     secret = ui.item.secret; 
    } 
}); 
}); 
使用

(变量ID标签需要:

在cities.php的PHP。标签用于填充下拉列表。当列表中的标签值被点击时,值被输入到输入框中)。

// important to set header with charset 
header('Content-Type: text/html; charset=utf-8'); 
$term = $_POST["term"]; 
// some database stuff removed 
// loop it through and build array 
$n = 0; 
    while ($row = $q->fetch()) { 
     $row_array[$n]['id'] = $row['City']; 
     $row_array[$n]['label'] = $row['Country']; 
     $row_array[$n]['value'] = $row['Region']; 
     $row_array[$n]['secret'] = 'blabla'; 
     $n++; 
    } 
    // encode it to json format 
    echo json_encode($row_array); 

的JSON送回:

(当长期=纽约?)

[{"id":"New York","label":"United States","value":"New York","secret":"blabla"},{"id":"Minnesota","label":"United States","value":"New York Mills","secret":"blabla"},{"id":"New York","label":"United States","value":"New York Mills","secret":"blabla"}] 

因此,要回顾:

  • 默认情况下,它发送变量“term”与搜索词到后端页面。
  • 它需要“id”,“value”和“label”变量发送回去。
  • 默认情况下,下拉列表中填充了“标签”值。
  • 默认情况下,单击列表将填充“值”的输入框。
  • 您可以添加额外的变量名称并对它们进行设置,但需要上述三个名称。
  • JSON语法需要像上面提供的那样。

我希望它有帮助。

您的数据未显示,因为自动完成功能需要以某种方式(id,标签和值)的数据。另请参阅其他答案。

您的getlist2函数提供了另一种数据结构(__type,TagID,UniqueName,TagName和CreatedAt)。

尝试修改getlist2以回馈正确的语法。

你对主题start(jquery autocomplete + .ajax)的最后一个改变看起来没问题,那段代码不工作?

+0

谢谢它确实解决了我的问题。我创建了另外一些类,这些类被指定给json结构并填充数据。 – 2011-06-09 11:10:18