2017-10-12 5 views
1

Entschuldigung für die falsche Formatierung oder Schreibweise. Wie schreibe ich diesen Posten in Eile. :)Übergeben von Json-Daten an den MVC-Controller - JObject-Parameter der Aktionsmethode

Ich übergebe json Daten zu Aktionsmethode von einfachen Controller (MVC-Controller). Hier ist der folgende Beispielcode als Referenz.

JS Code:

var json = {IsInit: true, SearchParam: {Typ: "xx", Name: "xx", sort: ""}};

Nx$(document).ready(function() { 

     Nx$.ajax({ 
      async: true, 
      contentType: "application/json; charset=utf-8", 
      type: "POST", 
      url: "Home/Data", 
      dataType: "json", 
      data: JSON.stringify(json), 
      success: function (msg) { 
       alert('success'); 
      }, 
      error: function (jqxhr, textStatus, error) { 
       alert('fail'); 
      } 
     }); 

Aktion Methode:

<HttpPost> 
     <Route("Data")> 
     Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Newtonsoft.Json.Linq.JObject) As ActionResult 
      Return Nothing 
     End Function 

Nun oben Aktion rufen gar nicht. Wenn Sie jedoch den folgenden Code verwenden, wird der Aufruf ausgeführt, aber SearchParam hat nur den Typ [object], und Sie können keinen Wert des searchParam-Objekts verwenden.

<HttpPost> 
    <Route("Data")> 
    Public Function GetData(ByVal IsInit As Boolean, ByVal SearchParam As Object) As Object 
     Return Nothing 
    End Function 

Ich denke, dass es nicht in der Lage ist, mehrere Parameter in POST-Anfrage mit komplexen JSON-Objekt übergeben.

Wie kann ich JSON-Daten an die Aktionsmethode des MVC-Controllers übergeben, so dass SearchParam Json-Daten in JObject konvertiert werden. d. h. die erste Signatur der ersten Aktionsmethode sollte verwendet werden, ohne wesentliche Änderungen der Signatur der Methode.

Few Beobachtung:

  1. wenn i obige Aktion Verfahren wie in api API-Controller eingeschaltet; Es fängt an zu arbeiten, aber nachdem du gesagt hast, dass du der folgenden Methodensignatur folgen musst. unter Ansatz funktioniert nicht für MVC-Controller. Ich weiß nicht warum? Aus irgendeinem Grund; Ich kann nicht mit API-Controller gehen.

    <HttpPost> 
        <Route("Data")> 
        Function GetData(ByVal req As Newtonsoft.Json.Linq.JObject) As ActionResult 
         Return Nothing 
        End Function 
    

Dank !!

+0

Daten: JSON.Stringify (JSON), konvertiert Daten in Zeichenfolge. Ich würde vorschlagen, dass Sie den dataType entfernen: "json", in ajax params –

Antwort

2

Besser, JOBject nie dafür zu verwenden. Stattdessen ist es viel praktischer und sehr empfehlenswert, eine Modellklasse zu erstellen und zu verwenden. Die MVC-Web-API bindet dann den eingehenden JSON kostenlos an ein Model-Objekt.

Beispiel:

Public Class MyData 
    Public Property IsInit As Boolean 
    Public Property Type As String 
    Public Property Name As String 
    Public Property Sort As String 
End Class 

Bitte beachte, dass ich hier alles in eine Klasse gestapelt. Wenn Sie die IsInit getrennt vom Rest behalten wollen, dann können Sie es wie folgt aufgeteilt:

Public Class Param 
    Public Property Type As String 
    Public Property Name As String 
    Public Property Sort As String 
End Class 

Public Class MyData 
    Public Property IsInit As Boolean 
    Public Property SearchParam as Param 
End Class 

dann Ihre Aktion Methode wie folgt ändern:

Function GetData(<FromBody()> ByVal data As MyData) As ActionResult 
    ... 
End Function 

Schließlich müssen Sie wahrscheinlich data: json in Ihrer verwenden Anruf, also ohne Anruf JSON.stringify().

+0

Danke Peter. Es war in der Nähe von dem, was ich gesucht habe. – user2761594

0

Danke Peter !! Dein Kommentar gab mir die Richtung. Unterhalb des Code-Snippets, mit dem JSON-Daten in das Dictionary-Objekt eingefügt werden.Hier verstehe ich Ihren Punkt für die Verwendung von JObject und stattdessen auf Model-Objekt. Aber aus irgendeinem Grund; Ich muss Wörterbuch-Objekt verwenden, um JSON aufgrund der dynamischen JSON-Natur von anderen Endpunkt zu erhalten.

Public Class MyData 
      Public Property IsInit As Boolean 
      Public Property SearchParam As Dictionary(Of Object, Object) 
     End Class 

Vielen Dank !!

Verwandte Themen