我正在尝试获取自动完成插件,以使用大学名称填充一个文本框,并使用大学代码填充另一个文本框。下面的代码返回结果并填充大学名称文本框,但是我不知道如何填充另一个输入。

我尝试遵循此example,但是遇到了问题,甚至无法调用webmethod。奇怪的是,似乎在自动完成功能附加到用户键入的文本框之前调用了ajax。不知道是什么触发了js调用自动完成方法。

我不得不使用json(link)将上述内容与jquery ui文档结合在一起以实现自动完成。但是我仍然不知道如何像第一个示例中那样填充第二个输入。

有任何想法吗?

这是jQuery和HTML

<script language="javascript" type="text/javascript">
    $(function () {
        $("#university").autocomplete({
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    url: "AutoComplete.asmx/GetUniversities",
                    dataType: "json",
                    data: "{ 'data': '" + request.term + "' }",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        response($.map(data, function (item) {
                            return {
                                value: item.Descr,
                                UnivCode: item.UnivCode

                            }
                        }));
                    }
                });
            }
        });
    });
</script>
<div class="ui-widget">
    <label for="university">University: </label>
    <input id="university" type="text"/>
    <label for="universityID">ID: </label>
    <input id="universityID" type="text" />
</div>


这是我的.net网络方法

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;
using System.Web.Script.Services;
using System.Text;
using System.Data;

[ScriptService()]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class AutoComplete : System.Web.Services.WebService
{

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public List<University> GetUniversities(string data)
    {
        List<University> UniversityList = new List<University>();

        try
        {
            clsDataBase db = new clsDataBase();
            DataTable dt = new DataTable();
            StringBuilder sql = new StringBuilder();
            Dictionary<string, object> parms = new Dictionary<string, object>();

            sql.Append(" SELECT univ_code ");
            sql.Append(" , INITCAP(univ_desc) AS descr ");
            sql.Append(" FROM lk_university ");
            sql.Append(" WHERE UPPER(univ_desc) LIKE UPPER(?) ");
            sql.Append(" ORDER BY univ_desc  ");
            parms.Add("university", "%" + data + "%");

            dt = db.executeParmQuery(sql.ToString(), parms);
            DataView dv = new DataView(dt);


            ArrayList filteredList = new ArrayList();

            foreach (DataRowView drv in dv)
            {
                University university = new University();
                university.UnivCode= drv["univ_code"].ToString();
                university.Descr = drv["descr"].ToString();

                UniversityList.Add(university);
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
            //return null;
        }
        //}
        return UniversityList;
    }


    public class University
    {
        string _value;
        public string value
        {
            get { return _Descr + " (" + _UnivCode + ")"; }
        }

        string _Descr;
        public string Descr
        {
            get { return _Descr; }
            set { _Descr = value; }
        }

        string _UnivCode;
        public string UnivCode
        {
            get { return _UnivCode; }
            set { _UnivCode = value; }
        }
    }
}


编辑

通过添加select事件,我可以使它正常工作。在我以前的测试中,我在那儿放了它,但是在错误的位置(最初嵌套在成功事件中)。还必须在成功事件中添加设置值的三行:item.Descr,Descr:item.Descr和UnivCode:item.UnivCode。我不太了解这些引用或它们在做什么,因为输入的实际设置是在select事件中完成的,在事件中我指定了输入的实际ID($('#university')。val(ui .item.Descr);),但这是使代码正常工作所必需的。

这是工作中的jQuery,没有对html或.net代码进行任何其他更改。

<script language="javascript" type="text/javascript">
    $(function () {
        $("#university").autocomplete({
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    url: "AutoComplete.asmx/GetUniversities",
                    dataType: "json",
                    data: "{ 'data': '" + request.term + "' }",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                        response($.map(data, function (item) {
                            return {
                                value: item.Descr,
                                Descr: item.Descr,
                                UnivCode: item.UnivCode
                            }
                        }));
                    }
                });
            },
            select: function (event, ui) {
                $('#university').val(ui.item.Descr);
                $('#universityID').val(ui.item.UnivCode);
                return false;
            }
        });
    });

最佳答案

通过添加select事件,我可以使它正常工作。在我以前的测试中,我在那儿放了它,但是在错误的位置(最初嵌套在成功事件中)。还必须在成功事件中添加设置值的三行:item.Descr,Descr:item.Descr和UnivCode:item.UnivCode。我不太了解这些引用或它们在做什么,因为输入的实际设置是在select事件中完成的,在事件中我指定了输入的实际ID($('#university')。val(ui .item.Descr);),但这是使代码正常工作所必需的。

这是工作中的jQuery,没有对html或.net代码进行任何其他更改。

$(function () {
    $("#university").autocomplete({
        source: function (request, response) {
            $.ajax({
                type: "POST",
                url: "AutoComplete.asmx/GetUniversities",
                dataType: "json",
                data: "{ 'data': '" + request.term + "' }",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    response($.map(data, function (item) {
                        return {
                            value: item.Descr,
                            Descr: item.Descr,
                            UnivCode: item.UnivCode
                        }
                    }));
                }
            });
        },
        select: function (event, ui) {
            $('#university').val(ui.item.Descr);
            $('#universityID').val(ui.item.UnivCode);
            return false;
        }
    });
});

08-25 12:31