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

时间:2010-02-22 20:19:06

标签: 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({
        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

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

3 个答案:

答案 0 :(得分:3)

我最终通过jQuery ajax命令以这种方式发送对象来解决我的问题:

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

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

答案 1 :(得分:1)

您正在尝试将字符串传递给该方法。您将需要接受该字符串,并使用fx对其进行反序列化。 JavascriptSerializerJSON.NET

答案 2 :(得分:0)

我知道这是非常古老的,但是当你用它来弄清问题是什么时它不是很直观。你非常接近,但我希望在此之后添加更多内容以防其他人后来想要做同样的事情。这也适用于嵌套对象,我可以说的一件事就是在你的JS变量中CASE很重要,这些变量映射到页面方法上的.NET POCO。

你的“答案”是我开始的地方。并且如下面的评论中所示,是的,您必须传递页面方法变量名称中包含的对象

我再说一遍,这是CASE敏感的,不仅可以绊倒对象的名称,还可以摧毁它的属性。因此,为了解决这个问题,我通常在.NET中创建我的POCO对象,然后将其复制到页面,以便我知道名称,大小写和所有都是正确的。 像这样:

POCO:

Public Class CustomObject
    Public Property Id as integer
    Public Property ReqDate as DateTime
    Public Property Message as string
End Sub

现在使用已定义的页面方法POCO,完全复制“模型”,使其与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 ):

<WebMethod()> _
Public Shared Function PostCustomObject(custobj as CustomObject) as String
    return custobj.Message
End Function