从ASMX Web服务读取XML数据以进行Jquery自动完成

时间:2011-04-14 13:20:52

标签: c# jquery web-services asmx

我和ASMX网络服务无法使用。我们争吵。她提出了我们过去的论点。这是一种痛苦。我们的关系在岩石上!

我有一个ASMX Web服务,我没有使用Newtonsoft库进行序列化(解释为什么在这里:http://encosia.com/2011/04/13/asp-net-web-services-mistake-manual-json-serialization/)。它看起来像这样:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string[] GetCitiesWithState(string isoalpha2, string prefixText)
    {
        var dict = AtomicCore.CityObject.GetCitiesInCountryWithStateAutocomplete(isoalpha2, prefixText);
        string[] cities = dict.Values.ToArray();
        return cities;
    }

足够简单吧?搜索new时会返回此信息:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <string>New Orleans, Louisiana</string>
  <string>New York, New York</string>
</ArrayOfString>

我期待着JSON,但经过一些阅读后,似乎我不应该尝试序列化输出 - 它应该恰好发生吗?无论如何,所以我在前端有以下JQuery:

$('#<%=txtCity.ClientID%>').autocomplete('<%=ResolveUrl("~/AtomicService/Assets.asmx/GetCitiesWithState")%>', {
            dataType: 'json',
            httpMethod: 'POST',
            contentType: 'application/json; charset=utf-8',
            parse: function (data) {
                var rows = new Array();
                for (var i = 0; i < data.d.length; i++) {
                    rows[i] = { data: data.d[i], value: data.d[i].Value, result: data.d[i].Value };
                }
                return rows;
            },
            formatItem: function (row, i, n) {
                return row.Value;
            },
            extraParams: {
                minChars: 2,
                isoalpha2: '<%=Session["BusinessCountry"].ToString()%>',
                maxRows: 20,
                prefixText: function () {
                    return $('#<%=txtCity.ClientID%>').val()
                }
            },
            max: 20
        }).result(function (event, data, formatted) {
            if (data) {
                alert(data['Key']);
            }
        });

我可以看到使用Chrome的来电:

what one can see in Chrome

然而事情发生了!没有Jquery错误,没有烟花,没有任何东西。她无视我。

起初我指责网络服务,但我认为这可能与我如何在jquery中解析和格式化数据有关。

所以,我的问题是,我做错了什么以及如何让自动完成工作正常?

帮助赞赏:)

编辑:它可能没有帮助,但这是我在Fiddler看到的:

enter image description here

2 个答案:

答案 0 :(得分:5)

jQuery UI自动完成不再使用formatItem方法。那个和许多其他类似的方法都出现在autocomplete的早期版本中,它是一个插件here

我已经使用jQuery UI的自动完成重写了你的代码,它适用于我的以下htm和asmx文件。

有关您可以使用的更多方法,请参阅jQueryUI autocomplete上的演示。

我使用了www.json.org上的json2.min.js 此外,我已将[System.Web.Script.Services.ScriptService]属性添加到Service1类,以便可以直接从jQuery作为json Web服务调用它。

这些文章帮助了我:

ASMX and JSON – Common mistakes and misconceptions

Using jQuery to Consume ASP.NET JSON Web Services

3 mistakes to avoid when using jQuery with ASP.NET AJAX

htm文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>jQuery to ASMX</title>
    <link rel="Stylesheet" type="text/css"
          href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/themes/cupertino/jquery-ui.css"/>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>

    <script type="text/javascript"
            src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js"></script>

    <script type="text/javascript" src="http://localhost/Scripts/json2.min.js"></script>
</head>
<body>

<script type="text/javascript">
    $(document).ready(function() {

        $("#txtInput").autocomplete({
            source:function (request, response) {
                var paramters = {
                    isoalpha2: '<%=Session["BusinessCountry"].ToString()%>',
                    prefixText: request.term
                };
                $.ajax({
                    url: 'Service1.asmx/GetCitiesWithState',
                    type: 'POST',
                    dataType: 'json',
                    contentType: 'application/json; charset=utf-8',
                    data: JSON.stringify(paramters),
                    success: function(data) {
                        response($.each(data.d, function(index, value) {
                            return {
                                label: value,
                                value: index
                            }
                        }));
                    }
                });
            },
            minLength:2,
            delay:500
        });

    });
</script>

<p>
    Hello, World!</p>
<label for="txtInput">
    Enter the string here:</label><input type="text" id="txtInput"/>
</body>
</html>

asmx文件

using System.Web.Script.Services;
using System.Web.Services;

namespace jQueryAutoCompleteBackEnd
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class Service1 : WebService
    {

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string[] GetCitiesWithState(string isoalpha2, string prefixText)
        {
            return new string[] { "New Orleans, Lousiana", "New York, New York" };
        }

    }
}

答案 1 :(得分:0)

asmx webmethod返回XML而不是JSON的原因是因为HTTP方法是GET rather than POST

为了让自动完成插件使用POST,你必须使用回调函数see here

来实现source参数。