2010-10-30 70 views
1

这里是我的web服务:得到web服务数据

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> 

它不工作是任何人谁可以帮我?

回答

1

首先为web方法应该使用[ScriptMethod (ResponseFormat = ResponseFormat.Json)]属性或在web.config中配置相同的如果您使用.NET 4.0。在这两种情况下,您都不需要手动推动任何类型的JSON序列化。而不是你可以返回对象本身。换句话说,你应该遵循的建议tvanfosson,但返回List<Article>直接:

[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的类型从stringint表明输入参数不能是只有字符串。它也可以是类实例(请参见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了解更多信息。

0

你的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()); 
    } 
}