Отправка сложного объекта в качестве параметра в Asp.Net PageMethod - PullRequest
2 голосов
/ 22 февраля 2010

Я пытаюсь отправить объект, созданный в JavaScript, в ASP.NET PageMethod. Этот объект отражает свойства существующего настраиваемого бизнес-объекта, поэтому я надеялся, что смогу передать один объект вместо параметра для каждого свойства. Я получаю сообщение об ошибке "Неизвестный веб-метод 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

Я использую другой PageMethod, который просто принимает int, и это прекрасно работает.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2010

Я решил проблему, отправив объект таким образом с помощью команды jQuery ajax:

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

это автоматически сериализовало объект и вернул его моему WebMethod. Когда я попытался отправить объект как есть, я получил сообщение об ошибке «Недопустимый примитив JSON».

1 голос
/ 22 февраля 2010

Вы пытаетесь передать строку в метод. Вам нужно будет принять строку и десериализовать ее с помощью fx. JavascriptSerializer или JSON.NET

0 голосов
/ 11 апреля 2018

Я знаю, что это невероятно старо, но не очень интуитивно понятно, когда вы используете это, чтобы выяснить, в чем заключаются проблемы. Вы очень близки, но я хотел бы добавить еще кое-что на тот случай, если кто-то позже захочет сделать то же самое. Это работает и с вложенными объектами, я могу сказать лишь одно: CASE имеет значение в ваших переменных JS, которые отображаются на .NET POCO в методе page.

Я начну с вашего "ответа". И, как в комментариях ниже, да, вы должны передать объект , заключенный в имя переменной метода страницы .

Скажу еще раз, это CASE-Sensitive и может сбить вас с толку не только по имени объекта , но и по его свойствам. Поэтому, чтобы бороться с этим, я обычно создаю свой объект POCO в .NET, затем копирую его на страницу, чтобы я знал имена, заглавные буквы и все они были правильными. Примерно так:

ПОКО:

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
...