【问题标题】:get data from web service by jquery通过 jquery 从 Web 服务获取数据
【发布时间】:2010-10-30 13:04:04
【问题描述】:

这是我的网络服务:

public class Header : System.Web.Services.WebService {
    public Header () {}
    [WebMethod]
    public string GetArchive(string PageID)
    {
        StringBuilder sb = new StringBuilder();
        BusinessRules.News news = new BusinessRules.News();
        BusinessObject.NewsItemList newsList =
            news.GetListbySectionID(int.Parse(PageID));

        foreach (BusinessObject.NewsItem item in newsList)
        {
            sb.Append(item.ID + " : " + item.Date);
        }
        return sb.ToString();
    }

}

在哪里

<body>
    <form id="form1" runat="server">
    <div>        
        <div runat="server" id="Content">
        </div>
        <div>
            <a id="LinkBtnAll" href="#">View</a>
        </div>
    </div>
    </form>
</body>

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

        var ParamValue = $.getUrlVar("id");        

        $('#LinkBtnAll').click(function () {
            $.ajax({ type: "POST",
                url: "Services/Header.asmx/GetArchive",
                data: "{'PageID'," + ParamValue + "}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: true,
                cache: false,
                success: function (msg) {
                    $('#Content').text(msg.d);
                }
            })
            return false;
        });   
    });            
</script>

没有人能帮帮我吗?

【问题讨论】:

    标签: asp.net json jquery


    【解决方案1】:

    首先for应该使用[ScriptMethod (ResponseFormat = ResponseFormat.Json)]属性作为web方法,或者如果你使用.NET 4.0,在web.config中配置相同的属性。在这两种情况下,您都不需要手动执行任何类型的 JSON 序列化。取而代之的是,您可以只返回对象本身。换句话说,你应该听从tvanfosson的建议,但是直接返回List&lt;Article&gt;

    [System.Web.Script.Services.ScriptService]
    public class Header : System.Web.Services.WebService {
        [WebMethod, ScriptMethod (ResponseFormat = ResponseFormat.Json)]
        public List<Article> GetArchive(int PageID)
        {
            BusinessRules.News news = new BusinessRules.News();
            BusinessObject.NewsItemList newsList = news.GetListbySectionID(PageID));
            return newsList.Select (a => new Article
                           {
                               ID = a.ID,
                               Date = a.Date
                           });
        }
    
        public class Article
        {
            public string ID { get; set; }
            public string Date { get; set; }
        }
    }
    

    我将输入参数PageID 的类型从string 更改为int,以表明输入参数不能仅为字符串。它也可以是一个类实例(参见my old another)。

    $(document).ready(function () {/*the code here you will see below*/});里面的客户端:

    var ParamValue = $.getUrlVar("id");
    var pageID = parseInt(ParamValue,10);
    
    $('#LinkBtnAll').click(function () {
        $.ajax({
            type: "POST",
            url: "Services/Header.asmx/GetArchive",
            data: {PageID: JSON.stringify(pageID)},
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                $('#Content').text(msg.d);
            }
        })
        return false;
    });
    

    您应该以其他方式对来自msg.d 的结果进行解码,因为msg.d 是一个数组,但它是一个简单的JavaScript 代码。

    我建议您查看old answeranother one 了解更多信息。

    【讨论】:

      【解决方案2】:

      我为此编写了一个 jquery 插件。它使您的调用和参数传递变得非常容易。下载地址:http://www.4shared.com/file/Y72VBeLc/PageMethod.html

      【讨论】:

        【解决方案3】:

        首先,您的 JSON 语法是错误的。整个内容需要用大括号括起来,您的属性需要用逗号分隔,并且您应该引用您的属性名称和可能的值,因为这些值可能包含空格。

        public class Header : System.Web.Services.WebService
        {
            public Header () {}
        
            [WebMethod]
            public string GetArchive(string PageID)
            {
                StringBuilder sb = new StringBuilder("{");
                BusinessRules.News news = new BusinessRules.News();
                BusinessObject.NewsItemList newsList = news.GetListbySectionID(int.Parse(PageID));
                foreach (BusinessObject.NewsItem item in newsList)
                {
                    sb.Append("\"" + item.ID + "\" : \"" + item.Date + "\"," );
                }
                return sb.ToString().TrimEnd(",") + "}";
            }
        }
        

        话虽如此,更好的方法是使用 JSON 序列化程序。请注意,以下示例中的格式将不同于 JSON 对象的集合,而不是包含所有属性的单个 JSON 对象。您必须更改您的客户代码以解决此问题。

        public class Header : System.Web.Services.WebService
        {
            private class Article
            {
                public string ID { get; set; }
                public DateTime Date { get; set; }
            }
        
            public Header () {}
        
            [WebMethod]
            public string GetArchive(string PageID)
            {
                var articles = new List<Article>();
                BusinessRules.News news = new BusinessRules.News();
                BusinessObject.NewsItemList newsList = news.GetListbySectionID(int.Parse(PageID));
                var articles = newsList.Select( a => new Article
                               {
                                   ID = a.ID,
                                   Date = a.Date
                               };
                var stream = new MemoryStream();
                using (var serializer = new DataContractJsonSerializer(articles.GetType());
                serializer.WriteObject( stream, articles );
                return Encoding.Default.GetString( stream.ToArray() );
            }
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 2013-08-24
          • 1970-01-01
          • 2018-05-11
          • 2012-05-27
          • 2014-07-08
          • 2018-04-24
          相关资源
          最近更新 更多