2011-05-01 85 views
2

我试图使用自动完成的小部件,通过AJAX请求从远程源获取其数据。数据应该作为AddressController上GetDistricts Action方法的JSON结果。不幸的是,当我输入文本框时,菜单不会弹出。我检查了Firebug的响应,一切似乎好: {"districtNames":["Beirut","Bekaa","Mount Lebanon","South","Nabatieh","North"]},所以我真的不知道发生了什么事情......这里是我的jQuery代码:jQuery UI自动完成:菜单不显示

  district.autocomplete({ 
       minLength: 2, 
       source: function (request, response) { 
        $.ajax({ 
         type: "GET", 
         url: '@Url.Action("GetDistricts", "Address")', 
         dataType: "json", 
         success: function (data) { 
          response($.map(data, function (item) { 
           return { 
            label: item.text, 
            value: item.text 
           } 
          })) 
         } 
        }) 
       } 
      }); 

这是我的操作方法:

public ActionResult GetDistricts(string term) 
    { 
     var districts = _service.GetDistricts(); 
     var districtNames = from c in districts select c.Name; 
     return Json(new {districtNames}, JsonRequestBehavior.AllowGet); 
    } 

PS:我尝试使用本地数据,其中源是一个数组,它工作得很好。所以我不认为这是与CSS有关......

回答

4

控制器操作中的结果数组不是小部件所期望的格式。自动完成需要一个字符串数组(或具有valuelabel属性的对象数组),而不是具有单个属性的对象,其值是字符串数组。

public ActionResult GetDistricts(string term) 
{ 
    var districts = _service.GetDistricts(); 
    var districtNames = from c in districts select c.Name; 
    return Json(districtNames, JsonRequestBehavior.AllowGet); 
} 

如果你把这个路线,你甚至可以用去除大量的$.ajax代码脱身,并让自动完成照顾它:

你可以通过更新控制行动解决这个问题:

district.autocomplete({ 
    minLength: 2, 
    source: '@Url.Action("GetDistricts", "Address")' 
}); 

或者你可以按摩你的数据只是一个位$.ajaxsuccess回调中:

district.autocomplete({ 
    minLength: 2, 
    source: function (request, response) { 
     $.ajax({ 
      type: "GET", 
      url: '@Url.Action("GetDistricts", "Address")', 
      dataType: "json", 
      success: function (data) { 
       response($.map(data.districtNames, function (item) { 
        return { 
         label: item.text, 
         value: item.text 
        } 
       })); 
      } 
     }); 
    } 
}); 

$.map调用与data.districtNames

+0

@Andrew Whitaker:是的,我改变了我从操作方法发回数据的方式。它工作okey和菜单弹出。但我无法选择一个项目。它一直抛出这个错误:'f.item是null'。这可能是自动完成小部件本身的错误还是什么? – Kassem 2011-05-01 22:00:24

+0

@Kassem:有趣 - 你还在将'source'定义为一个函数,还是仅仅使用url来进行控制器操作? – 2011-05-01 22:05:40

+0

@Andrew Whitaker:只是控制器操作的网址。当我尝试将源定义为函数时,菜单弹出“空”。我检查了萤火虫中的'ul'标签,所有'li'标签里面什么也没有。有什么想法吗? – Kassem 2011-05-01 22:07:15