【问题标题】:store autocomplete source (Mvc 4)存储自动完成源 (Mvc 4)
【发布时间】:2013-09-13 16:18:50
【问题描述】:

我正在调用一个函数来获取自动完成的来源。我的 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;
    }

【问题讨论】:

  • 为什么不在 document.ready 上调用该方法并将该列表存储在全局变量中,例如 list,然后存储在自动完成的源中,例如 source:list?
  • 您是否尝试减少服务器处理或带宽? (或两者兼而有之?)
  • @Sarcastic 我试过了,但由于某种原因,文本框没有显示选项
  • @HiTechMagic 两者都有,因为地址列表可能很长​​span>
  • 你能展示一下代码吗?

标签: c# jquery asp.net-mvc wcf autocomplete


【解决方案1】:

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

public ActionResult GetAddresses(string term)

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

source:list

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

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

var filteredItems = items.Where(
        item => item.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) >= 0
        );

【讨论】:

    【解决方案2】:

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

    来自以下链接:jQuery UI Autocomplete and Caching Query Results

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

    【讨论】:

    • 谢谢,但这只缓存输入单词的结果,如果用户输入一个新单词,该函数再次调用网络服务,我想存储整个列表
    • 您可以控制 jQuery 自动完成数据的来源。将列表从调用中缓存到您从中获取 complete 单词列表的任何方法。之后,您可以控制源并可以简单地正则表达式您的本地单词列表缓存,如上面的示例所示
    【解决方案3】:

    我按照 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);
            });
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多