无法使用$ .getJSON和Ajax调用从Webmethod接收JSON

时间:2012-12-03 10:45:19

标签: json jquery webforms

我想在客户端处理一些JSON对象,但我指定的My WebMethod不想触发。

这是我在客户端脚本中使用的Ajax和GetJson方法: GetSJON

$(document).ready(function() {
         $(document).ready(function() {
             //attach a jQuery live event to the button
             $('#getdata').live('click', function() {
             $.getJSON('/Members_Only/StockMovement/WebForm1.aspx/StockPlacementOptions', function(data) {
               //alert(data); //uncomment this for debug
              // alert(data.item1 + " " + data.item2 + " " + data.item3); //further debug
             $('#showdata').html("<p>item1=" + data.item1 + " item2=" + data.item2 + " item3=" + data.item3 + "</p>");
        });
    });
});

这是Ajax

$(document).ready(function () {
        $.ajax({
            type: "POST",
            url: "/Members_Only/StockMovement/WebForm1.aspx/StockPlacementOptions",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: "{}",
            success: function (res) {
                $('#Results').append(CreateTableView(res)).fadeIn();
            }
        });
    });

这两个方法都调用StockPlacementOptions,这是我的WebMethod,如下所示:

 [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json,
    UseHttpGet = true, XmlSerializeString = false)]
    public static List<StockReturnMethod> StockPlacementOptions()
    {
        scmEntitiesPrimaryCon entities = new scmEntitiesPrimaryCon();
        var binOptions = (from avail in entities.ProductAvailibleBins(1, 2)
                          select new StockReturnMethod() { LotID = (int)avail.LotID, LotName = avail.LotName, AreaID = (int)avail.AreaID, AreaName = avail.AreaName, BinID = (int)avail.BinID, BinName = avail.BinName }).ToList();

        return binOptions;
    }

如果我可以在$(document).ready事件上启动JSON Web方法,我将能够处理和处理来自那里的数据。我也尝试用KnockoutJS来查看不同的jQuery库,它具有数据处理能力,也没有运气。 我正在使用带有Html5标记的Framework 4上的ASP Webforms。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

为什么在客户端使用两个document.ready()处理程序getJson和ajax

$(document).ready(function() { // <-------you can remove this handler

     $(document).ready(function() {
         $('#getdata').live('click', function() {
         $.getJSON('/Members_Only/StockMovement/WebForm1.aspx/StockPlacementOptions', function(data) {
           //alert(data); //uncomment this for debug
          // alert(data.item1 + " " + data.item2 + " " + data.item3); //further debug
         $('#showdata').html("<p>item1=" + data.item1 + " item2=" + data.item2 + " item3=" + data.item3 + "</p>");
         });
     });
});  // <-------you can remove this handler

虽然我不确定这可能是问题,但如果这有帮助,请尝试这个。

答案 1 :(得分:0)

我通过结合使用KnockoutJS和ajax来解决这个问题。

通过使用knockoutJS映射模型,无论如何我能够操纵返回的JSON:)

这是我的Jquery,它执行Mapping并从服务器获取JSON。

<script type="text/javascript">
//Declareing Viewmodel For KnockoutJS
    var viewModel;
    //Using Mapping Plugin for Knockout JS
    function bindModel(data) {
        viewModel = ko.mapping.fromJS(data);
        console.log(viewModel);
        ko.applyBindings(viewModel);
    }

    //Onload ObtainJSON
    $(document).ready(function () {
        $.ajax({
            url: "WebForm1.aspx/StockPlacementOptions",
            // Current Page, Method
            data: {},
            // parameter map as JSON
            type: "POST",
            // data has to be POSTed
            contentType: "application/json",
            // posting JSON content
            dataType: "JSON",
            // type of data is JSON (must be upper case!)
            timeout: 10000,
            // AJAX timeout
            success: function (result) {
                bindModel(result);
            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    });

</script>

我也稍微改变了Webmethod以获得我想要的结果:

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static List<StockReturnMethod> StockPlacementOptions()
    {
        scmEntitiesPrimaryCon entities = new scmEntitiesPrimaryCon();

        var binOptions = (from avail in entities.ProductAvailibleBins(1, 2)
                          select new StockReturnMethod() { LotID = (int)avail.LotID, LotName = avail.LotName, AreaID = (int)avail.AreaID, AreaName = avail.AreaName, BinID = (int)avail.BinID, BinName = avail.BinName }).ToList();

        return binOptions;
    }

就是这样:D

感谢所有帮助