2

JavaScriptで作成されたオブジェクトをASP.NETPageMethodに送信しようとしています。このオブジェクトは既存のカスタムビジネスオブジェクトのプロパティを反映しているため、各プロパティのパラメーターではなく、単一のオブジェクトを渡すことができると期待していました。このメソッドを使用しようとすると、「不明な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を使用していますが、これは正常に機能します。

4

3 に答える 3

3

私は、jQuery ajaxコマンドを介してこの方法でオブジェクトを送信することにより、問題を解決することになりました。

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

これにより、オブジェクトが自動的にシリアル化され、WebMethodに返されました。オブジェクトをそのまま送信しようとすると、「無効なJSONプリミティブ」というエラーが発生しました。

于 2010-02-23T11:58:04.657 に答える
1

メソッドに文字列を渡そうとしています。文字列を受け入れ、fxで逆シリアル化する必要があります。JavascriptSerializerまたはJSON.NET

于 2010-02-22T20:34:31.063 に答える
0

これは信じられないほど古いことは知っていますが、これを使用して問題が何であるかを理解するときは、あまり直感的ではありません。あなたはとても親密ですが、後で誰かが同じことをしたい場合に備えて、これにもう少し追加したいと思います。これはネストされたオブジェクトでも機能します。私が言えることの1つは、pageメソッドの.NETPOCOにマップするJS変数の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
于 2018-04-11T19:37:26.713 に答える