0

我正在调用一个函数来获取自动完成的来源。我的 jquery 函数调用控制器,控制器调用方法,方法调用 wcf 服务。我的 wcf 服务返回地址列表。我想知道是否有办法在第一次调用中存储地址列表(当用户仍然在视图上时),以防止每次用户使用自动完成文本框时调用服务。我尝试使用静态列表来执行此操作,但是数据库上的地址列表可以更改并且需要重新加载(至少在用户转到视图时的第一次调用中)。这是我的代码。

自动完成:

    $(function () {
        var availableTags = {                
            source: '/Address/GetAddresses/',
            minLength: 4,
            }            
        $("input.Places").live("keydown.autocomplete", function () {
            $(this).autocomplete(availableTags);
        });
    });

控制器:

    public ActionResult GetAddresses(string term)
    {
        var filteredItems = City.GetFilteredAddresses(term);
        return Json(filteredItems, JsonRequestBehavior.AllowGet);
    }

方法:

    public static IEnumerable<string> GetFilteredAddresses(string term)
    {
        var items = AddressesService(); This method call a wcf service and return the list of addresses
        var filteredItems = items.Where(
            item => item.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) >= 0
            );
        return filteredItems;
    }
4

3 回答 3

1

该列表未填充,因为控制器中的 GetAddresses 方法需要一个字符串参数,但您没有传递任何参数。

public ActionResult GetAddresses(string term)

解决方法可能是您获得 DOM 上所有地址的列表,无论用户输入的字符如何。您必须为此修改控制器和 WCF 代码。一旦你得到所有地址的列表,你可以简单地说

source:list

它将为您节省 ajax 调用。如果地址列表不是很大(我假设是正确的),这将是可行的。

无需将任何参数传递给控制器​​,只需删除此过滤器选项并将整个列表传递给 ajax 调用。

var filteredItems = items.Where(
        item => item.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) >= 0
        );
于 2013-09-14T18:30:15.717 回答
0

使用回调并简单地在本地缓存结果。

来自以下链接:jQuery UI 自动完成和缓存查询结果

变量缓存 = {};
$("#birds").autocomplete({
  来源:功能(请求,响应){
      if (cache.term == request.term && cache.content) {
          响应(缓存。内容);
          返回;
      }
      if (new RegExp(cache.term).test(request.term) && cache.content && cache.content.length
于 2013-09-13T17:21:12.527 回答
0

我做了 Sarcastic 所说的,我创建了一个新函数来获取地址列表并将其存储在全局变量中。这是代码:

    var list;
    $(document).ready(function () {
        $.ajax({
            url: '/Address/GetListAddresses/',
            dataType: "json",
            success: function (data) {
                list = data;
            }
        });
    });

自动完成

$(function () {
        var availableTags = {
            source: function (request, response) {
                response($.ui.autocomplete.filter(list, request.term));
            },
            minLength: 4,
        }                        
        $("input.Places").live("keydown.autocomplete", function () {
            $(this).autocomplete(availableTags);
        });
    });
于 2013-09-13T19:42:32.587 回答