получить данные из веб-сервиса с помощью jquery - PullRequest
1 голос
/ 30 октября 2010

вот мой веб-сервис:

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>

это не работает, кто-нибудь, кто может мне помочь?

Ответы [ 3 ]

1 голос
/ 30 октября 2010

Прежде всего для следует использовать атрибут [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, чтобы показать, что входные параметры не должны быть только строкой.Это может быть также экземпляр класса (см. мой старый ).

На стороне клиента внутри $(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.

Я рекомендую вам взглянуть на старый ответ и еще один для получения дополнительной информации.

0 голосов
/ 30 октября 2010

Ваш синтаксис JSON неверен, например.Все это должно быть заключено в фигурные скобки, ваши свойства должны быть разделены запятыми, и вы должны заключать в кавычки имена ваших свойств и, возможно, значения, поскольку значения, вероятно, имеют пробелы.лучшим способом было бы использовать сериализатор 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() );
    }
} 
0 голосов
/ 30 октября 2010

Для этой цели я написал плагин jquery. Это делает ваш вызов и передачу параметров очень простым. Вы можете скачать его с: http://www.4shared.com/file/Y72VBeLc/PageMethod.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...