将复杂对象作为参数发送到Asp.Net PageMethod

将复杂对象作为参数发送到Asp.Net PageMethod,asp.net,jquery,vb.net,pagemethods,Asp.net,Jquery,Vb.net,Pagemethods,我正在尝试将用JavaScript创建的对象发送到ASP.NET PageMethod。此对象镜像现有自定义业务对象的属性,因此我希望可以传递单个对象,而不是每个属性的参数。尝试使用此方法时,我收到一个错误“未知web方法SavePart” Javascript: function() { var pt = { Id: 1, Onhand: 20, LowPoint: 30, __type: 'Custom.Objects.Part'}; $.ajax({ ty

我正在尝试将用JavaScript创建的对象发送到ASP.NET PageMethod。此对象镜像现有自定义业务对象的属性,因此我希望可以传递单个对象,而不是每个属性的参数。尝试使用此方法时,我收到一个错误“未知web方法SavePart”

Javascript:

function() {
    var pt = { Id: 1, Onhand: 20, LowPoint: 30, __type: 'Custom.Objects.Part'};

    $.ajax({
        type: 'POST',
        url: 'partlist.aspx/SavePart',
        data: JSON.stringify(pt),
        contentType: 'application/json; charset: utf-8;'
        dataType: 'json',
        success: function(results) { alert('Success!'); }
    });
}
代码隐藏:

<WebMethod()> _
Public Shared Function SavePart(pt as Custom.Objects.Part) as Boolean
    Dim repo as new PartRepository()
    return repo.Save(pt)
End Function
_
公共共享函数SavePart(pt作为Custom.Objects.Part)作为布尔值
作为新零件库的Dim回购()
返回回购保存(pt)
端函数

我正在使用另一个PageMethod,它只接受int,这很好。

您正在尝试向该方法传递一个字符串。您需要接受该字符串,并使用fx对其进行反序列化。或者,

我通过jQuery ajax命令以这种方式发送对象,从而解决了我的问题:

data: '{"pt":' + JSON.stringify(pt) + '}'

这会自动序列化该对象并将其返回到我的WebMethod。当我尝试按原样发送该对象时,我收到一个错误,提示“无效JSON原语”“

我知道这是非常古老的,但当你用它来找出问题所在时,它不是很直观。你们很接近,但我想补充一点,以防以后有人想做同样的事情。这也适用于嵌套对象,我可以说的一件事是,在映射到.NET POCOs的JS变量中,page方法中的大小写很重要

我将从你的“答案”开始。与下面的注释一样,是的,您必须传递包装在其页面方法变量名中的对象

我再说一遍,这是区分大小写的,不仅在对象的名称上,而且在对象的属性上,都会让您感到困惑。所以为了解决这个问题,我通常在.NET中创建我的POCO对象,然后将其复制到页面上,这样我就知道名称、大小写以及所有内容都是正确的。 大概是这样的:

POCO:

现在有了一个已定义的POCO for page方法,可以完全按照JS/AJAX发布的方式复制该“模型”,并注意区分大小写

function ParseAndPostData()
{
   var data = { custobj: {
                Id: 1, 
                ReqDate: "04/12/2018",
                Message:"Hello!" 
                }
           };
  //Stringify the data so it goes through page method parser
  var postdata = JSON.stringify(data);
  $.ajax({
         type: 'POST',
         url: '/BasePath/SomePage.aspx/SomeMethod',
         data: postdata,
         contentType: 'application/json; charset=utf-8',
         dataType: 'json',
         success: function (msg) {
              var parsedACData = JSON.parse(msg.d);
              alert(parsedACData);
             },
        error: function (msg) {
              alert(msg);
              }
  });
}
页面方法(注意参数中的custobj):

_
公共共享函数PostCustomObject(CustomObj作为CustomObject)作为字符串
返回custobj.消息
端函数

Ah。。。这实际上是有道理的。仅仅发送pt可能会导致反序列化程序尝试将对象的每个属性作为单独的参数传递给webmethod。
function ParseAndPostData()
{
   var data = { custobj: {
                Id: 1, 
                ReqDate: "04/12/2018",
                Message:"Hello!" 
                }
           };
  //Stringify the data so it goes through page method parser
  var postdata = JSON.stringify(data);
  $.ajax({
         type: 'POST',
         url: '/BasePath/SomePage.aspx/SomeMethod',
         data: postdata,
         contentType: 'application/json; charset=utf-8',
         dataType: 'json',
         success: function (msg) {
              var parsedACData = JSON.parse(msg.d);
              alert(parsedACData);
             },
        error: function (msg) {
              alert(msg);
              }
  });
}
<WebMethod()> _
Public Shared Function PostCustomObject(custobj as CustomObject) as String
    return custobj.Message
End Function