28

複雑な JSON オブジェクトを MVC 4 コントローラー アクションに渡そうとして問題が発生しています。JSON コンテンツは可変であるため、MVC で JSON の個々のプロパティ/要素をアクション メソッドのパラメーター リスト内のパラメーターにマップしたくありません。コントローラー アクションで単一の JSON 文字列パラメーターとしてデータを取得したいだけです。

私のアクションメソッドの署名は次のとおりです。

    [HttpPost]
    [ValidateInput(false)]
    public string ConvertLogInfoToXml(string jsonOfLog)

そして、これが私のブラウザからいくつかのJSONデータを投稿しようとする私の試みです:

    data = {prop: 1, myArray: [1, "two", 3]}; 
    //'data' is much more complicated in my real application
    json = {jsonOfLog: data};

    $.ajax({
        type: 'POST',
        url: "Home/ConvertLogInfoToXml",
        data: JSON.stringify(json),
        success: function (returnPayload) {
            console && console.log ("request succeeded");
        },
        error: function (xhr, ajaxOptions, thrownError) {
            console && console.log ("request failed");
        },
        dataType: "xml",
        contentType: "application/json",            
        processData: false,
        async: false
    });

ConvertLogInfoToXML メソッドの先頭でブレークポイントに到達すると、jsonOfLog が null になります。

JavaScript で設定されている「json」変数を変更して、jsonOfLog プロパティを単純な文字列にすると、次のようになります。

json = { jsonOfLog: "simple string" };

次に、ConvertLogInfoToXML メソッドの先頭にあるブレークポイントに到達すると、jsonOfLog が文字列の値になります (たとえば、「単純な文字列」)。

アクション メソッドの jsonOfLog パラメータの型をオブジェクト型に変更してみました。

    [HttpPost]
    [ValidateInput(false)]
    public string ConvertLogInfoToXml(object jsonOfLog)

ここで、元の JavaScript コード (より複雑な「データ」オブジェクトを渡しています) を使用すると、jsonOfLog は {object} の値を取得します。しかし、デバッガーはウォッチ ウィンドウにそれ以上の詳細を表示しません。また、この変数を操作するためにどのメソッドを使用できるかわかりません。

渡されたデータが文字列化された複雑なオブジェクトである場合、JSON データを MVC コントローラーに渡すにはどうすればよいですか?

ありがとう、ノートル

4

6 に答える 6

2

この投稿を参照すると、答えが見つかると思います: JSON を C# 動的オブジェクトに逆シリアル化しますか?

ここであなたが望むものを達成するためのさまざまな方法があります。System.Web.Helpers.Json アプローチ (いくつかの回答がありません) が最も単純なようです。

于 2013-06-28T18:12:14.637 に答える
2

VB.NET バージョン

さて、私は MVC 4 WEB API に複数のパラメーターをポストするための実行可能な方法を探すのに数時間を費やしましたが、見つけたもののほとんどは「GET」アクションのためであるか、完全に機能しませんでした。しかし、ようやくこれが機能するようになったので、解決策を共有したいと思いました。

  1. NuGet パッケージを使用してダウンロードJSON-js json2し、Json.NET. NuGet パッケージをインストールする手順:

    (1) Visual Studio で、 [ Web サイト] > [NuGet パッケージの管理... ] に移動します。 ここに画像の説明を入力

    (2) 検索バーに json (またはその効果のあるもの) と入力し、 と を検索JSON-js json2しますJson.NET。それらをダブルクリックすると、パッケージが現在のプロジェクトにインストールされます。ここに画像の説明を入力

    (3) NuGet は自動的に json ファイルを~/Scripts/json2.min.jsプロジェクト ディレクトリに配置します。json2.min.js ファイルを見つけて、Web サイトのヘッドにドラッグ アンド ドロップします。: .js (javascript) ファイルのインストール手順については、このソリューションをお読みください。

  2. 必要なパラメーターを含むクラス オブジェクトを作成します。これを使用して、API コントローラーのパラメーターにアクセスします。コード例:

    Public Class PostMessageObj
    
    Private _body As String
    Public Property body As String
        Get
            Return _body
        End Get
        Set(value As String)
            _body = value
        End Set
    End Property
    
    
    Private _id As String
    Public Property id As String
        Get
            Return _id
        End Get
        Set(value As String)
            _id = value
        End Set
    End Property
    End Class
    
  3. 次に、POST アクションに使用する実際の MVC 4 Web API コントローラーをセットアップします。その中で、Json.NET を使用して、文字列オブジェクトがポストされたときに逆シリアル化します。適切な名前空間を使用することを忘れないでください。前の例を続けると、私のコードは次のとおりです。

    Public Sub PostMessage(<FromBody()> ByVal newmessage As String)
    
    Dim t As PostMessageObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of PostMessageObj)(newmessage)
    
    Dim body As String = t.body
    Dim i As String = t.id
    
    End Sub
    
  4. 文字列化された JSON オブジェクトを受け取るように API コントローラーを設定したので、$.ajax; を使用してクライアント側から POST アクションを自由に呼び出すことができます。前の例を続けて、これが私のコードです (localhost+rootpath を適切に置き換えてください):

    var url = 'http://<localhost+rootpath>/api/Offers/PostMessage';
    var dataType = 'json'
    var data = 'nothn'
    var tempdata = { body: 'this is a new message...Ip sum lorem.',
        id: '1234'
    }
    var jsondata = JSON.stringify(tempdata)
    $.ajax({
        type: "POST",
        url: url,
        data: { '': jsondata},
        success: success(data),
        dataType: 'text'
    });
    

ご覧のとおり、基本的には JSON オブジェクトを構築し、それを文字列に変換し、単一のパラメーターとして渡し、JSON.NET フレームワークを介して再構築しています。API コントローラーに戻り値を含めなかったので、success()関数に任意の文字列値を配置しました。


著者のメモ

これは、ASP.NET 4.0、WebForms、VB.NET、および MVC 4 Web API コントローラーを使用して、Visual Studio 2010 で行われました。MVC 4 Web API と VS2010 の統合に問題がある場合は、パッチをダウンロードして統合を可能にすることができます。Microsoft のダウンロード センターからダウンロードできます。

以下は、(主に C# で) 役立ついくつかの追加のリファレンスです。

于 2013-09-25T04:03:39.780 に答える
1

//asp.net mvc の単純な json オブジェクト

var model = {"Id": "xx", "Name":"Ravi"};
$.ajax({    url: 'test/[ControllerName]',
                        type: "POST",
                        data: model,
                        success: function (res) {
                            if (res != null) {
                                alert("done.");
                            }
                        },
                        error: function (res) {

                        }
                    });


//model in c#
public class MyModel
{
 public string Id {get; set;}
 public string Name {get; set;}
}

//controller in asp.net mvc


public ActionResult test(MyModel model)
{
 //now data in your model 
}
于 2015-12-24T17:05:00.837 に答える
0

私のクライアント側 (cshtml ファイル) は、DataTables を使用してグリッドを表示していました (現在は優れた Infragistics コントロールを使用しています)。そして、ユーザーが行をクリックすると、サーバーに戻って取引などの追加のサーバー側リクエストを行うために、そのレコードに関連付けられた行イベントと日付をキャプチャしました。 ..

DataTables の定義は次のように開始され (多くのものを残して)、Json オブジェクトに PUSH する場所の下にクリック イベントが表示されます。

    oTablePf = $('#pftable').dataTable({         // INIT CODE
             "aaData": PfJsonData,
             'aoColumnDefs': [                     
                { "sTitle": "Pf Id", "aTargets": [0] },
                { "sClass": "**td_nodedate**", "aTargets": [3] }
              ]
              });

   $("#pftable").delegate("tbody tr", "click", function (event) {   // ROW CLICK EVT!! 

        var rownum = $(this).index(); 
        var thisPfId = $(this).find('.td_pfid').text();  // Find Port Id and Node Date
        var thisDate = $(this).find('.td_nodedate').text();

         //INIT JSON DATA
        var nodeDatesJson = {
            "nodedatelist":[]
        };

         // omitting some code here...
         var dateArry = thisDate.split("/");
         var nodeDate = dateArry[2] + "-" + dateArry[0] + "-" + dateArry[1];

         nodeDatesJson.nodedatelist.push({ nodedate: nodeDate });

           getTradeContribs(thisPfId, nodeDatesJson);     // GET TRADE CONTRIBUTIONS 
    });
于 2013-06-28T20:33:55.187 に答える
0

数か月前、Json 形式の日付をコントローラーに送り返す必要があるという奇妙な状況に遭遇しました。髪を抜いた後の感想は以下の通りです。

私のクラスは次のようになります:

public class NodeDate
{
    public string nodedate { get; set; }
}
public class NodeList1
{
    public List<NodeDate> nodedatelist { get; set; }
}

次のように私のC#コード:

        public string getTradeContribs(string Id, string nodedates)
    {            
        //nodedates = @"{""nodedatelist"":[{""nodedate"":""01/21/2012""},{""nodedate"":""01/22/2012""}]}";  // sample Json format
        System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
        NodeList1 nodes = (NodeList1)ser.Deserialize(nodedates, typeof(NodeList1));
        string thisDate = "";
        foreach (var date in nodes.nodedatelist)
        {  // iterate through if needed...
            thisDate = date.nodedate;
        }   
    }

そのため、「ノード」オブジェクトで nodedates Json オブジェクト パラメータを逆シリアル化できました。もちろん、クラス「NodeList1」を使用して機能させます。

これがお役に立てば幸いです....ボブ

于 2013-06-28T18:04:04.297 に答える