我正在尝试将用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,这很好用。
答案 0 :(得分:3)
我最终通过jQuery ajax命令以这种方式发送对象来解决我的问题:
data: '{"pt":' + JSON.stringify(pt) + '}'
这会自动序列化对象并将其返回给我的WebMethod。当我尝试按原样发送对象时,我收到一条错误,说“无效的JSON原语”。
答案 1 :(得分:1)
您正在尝试将字符串传递给该方法。您将需要接受该字符串,并使用fx对其进行反序列化。 JavascriptSerializer或JSON.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