【问题标题】:How to Map data in jquery-ui autocomplete is not working如何在 jquery-ui 自动完成中映射数据不起作用
【发布时间】:2014-01-13 20:26:28
【问题描述】:

我正在使用 jquery-ui 自动完成功能并在自动完成功能内进行 ajax 调用,我正在调用返回 Json 的控制器操作,但下拉菜单中没有显示建议

Javascript

 function log(message) {
            $("<div>").text(message).prependTo("#log");
            $("#log").scrollTop(0);
        }

        $("#search").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: "/Home/GetCompanyNames",
                    dataType: "jsonp",
                    data: "searchterm=" + request.term,
                    success: function (data) {
                        response($.map(data, function (item) {
                            alert(item.Value);
                            return {
                                label: item.Name,
                                value: item.Name
                            };
                        }));
                    }
                });
            },
            minLength: 2,
            select: function (event, ui) {
                log(ui.item ?
                "Selected: " + ui.item.label :
                "Nothing selected, input was " + this.value);
            },
            open: function () {
                $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
            },
            close: function () {
                $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
            }
        });

    });

控制器中的操作:

    public JsonResult GetCompanyNames (string searchterm)
    {
        var companies = context.companyService.Query().Where(x => x.Name.Contains(searchterm)).ToList();
        var list = companies.Select(item => new SearchJsonModel
                                                {
                                                    LogoUrl = item.Logo != null || item.Logo != "" ? "<img  src='/Upload/" + item.Logo + "' />" : "<img src='/home/image?image=" + item.Name + "' />", Name = item.Name, Value = item.InternetName
                                                }).Select(model => (model)).ToList();
        return Json(list, JsonRequestBehavior.AllowGet);
    }

SearchJsonModel:

 public class SearchJsonModel
{
    public string Name { get; set; }
    public string Value { get; set; }
    public string LogoUrl { get; set; }
}

这就是我对 ajax 调用的响应(这是萤火虫的图像)

如果您需要更多详细信息,请询问我,并提前致谢。

编辑

现在我试图在选择回调中访问选定的值,但它给出了Undefined

select: function (event, ui) {
           alert(ui.item.Name);
                alert(ui.item.Value);
                alert(ui.item.LogoUrl);
        },

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-3 jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    您已将dataType 定义为jsonp,但看起来您正在返回标准json,请尝试更改您的dataType

    $("#search").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: "/Home/GetCompanyNames",
                dataType: "json",
                data: "searchterm=" + request.term,
                success: function (data) {
                    response($.map(data, function (item) {
                        return {
                            label: item.Name,
                            value: item.Name
                        };
                    }));
                }});
        },
        minLength: 2,
        select: function (event, ui) {
            log(ui.item ? "Selected: " + ui.item.label : "Nothing selected, input was " + this.value);
        },
        open: function () {
            $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
        },
        close: function () {
            $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
        }
    });
    

    【讨论】:

    • JsonJsonp有什么区别?
    • @smartboy 我相信维基百科解释得很好:JSONP, JSON
    • @smartboy 这有点复杂,因为您的响应中的实际项目不被自动完成保留。为了实现这一点,您需要覆盖内部 _renderItem 函数。请参考以下答案以获取示例:stackoverflow.com/questions/12855617/…(如果答案对您有帮助,请不要忘记使用左侧的向上箭头进行投票)。
    【解决方案2】:

    我不确定您的代码有什么问题,但您可以尝试另一种更简单的自动完成方法吗?喜欢

    $(document).ready(function () {
        $(":input[dataautocomplete]").each(function () {
            $(this).autocomplete({
                source: $(this).attr("dataautocomplete"),
                minLength: 2,
                select: function (event, ui) {
                    //do anything u need
                    //get ur name  ui.item.Name
                    //get ur URL   ui.item.LogoUrl
                }
            });
        });
    }); 
    

    html 喜欢

    <input  class="ui-autocomplete-input" type="text" value="" name="post" dataautocomplete="@Url.RouteUrl("default", new { controller = "somecontroller", action = "someaction" })" autocomplete="off" role="textbox" aria-autocomplete="list" aria-haspopup="true" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2016-03-10
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多