2015-05-13 23 views
6

Voglio passare un oggetto JSON complesso. Ma quando eseguo il debug di Controller Action tutte le Proprietà virtuali sono nulle. Lavorare con ASP.NET, EF e CF.Come passare un oggetto JSON complesso al controller ASP.net

JSON è inviare:

POST http://localhost:53214/api/trans/ HTTP/1.1 
    Pragma: no-cache 
    Content-Type: application/json; charset=utf-8 
    Host: localhost:53214 
    Content-Length: 221 

{ 
    "trans": { 
     "Location": { 
      "locID": 2 
     } 
    } 
} 

Il modello trans:

public class trans 
    { 
     [Key] 
     public int tID { get; set; } 
     //public int? locID { get; set; } 
     public virtual Location Location { get; set; } 

    } 
} 

Così, quando ho sempre posto il JSON tramite Fiddler tutte le proprietà virtuali sono nulli.

Debugsession

Prima ho lavorato con chiavi esterne come commentato nel Modello. Funziona bene

Voglio ricostruire il codice per ottimizzare il codice stesso.

Come è possibile inizializzare le proprietà e deserializzare correttamente il JSON?

saluti Marcus

risposta

11

ho creato un campione di lavoro piccolo per voi (si prega di seguito troverete la soluzione). Dipende principalmente da come costruisci il tuo oggetto lato client.

Model -

public class trans 
{ 
    [Key] 
    public int tID { get; set; } 
    public virtual Location Location { get; set; } 
} 

public class Location 
{ 
    public int locID { get; set; } 
} 

controller azioni -

public ActionResult Index() 
{ 
     return View(); 
} 

[HttpPost] 
public JsonResult Submit(trans trans) 
{ 
     return null; 
} 

vista semplice -

@{ 
    ViewBag.Title = "Home Page"; 
} 

<table id="example" class="display"> 
</table> 

@section scripts{ 
    <script> 
     $(function() { 
      var o = new Object(); 
      o.tID = 123; 
      o.Location = new Object(); 
      o.Location.locID = 456; 

      $.ajax({ 
       url: '@Url.Action("Submit", "Home")', 
       type: "POST", 
       cache: false, 
       data: JSON.stringify({ trans : o }), 
       contentType: "application/json; charset=utf-8", 
       success: function(data) { 
        if (data) { 
         alert("Success"); 
        } 
       }, 
       error: function(jqXhr, textStatus, errorThrown) { 
        alert(errorThrown); 
       } 
      }); 
     }) 
    </script> 
} 

Quando si eseguire la pagina, sarà colpito dell'azione post centralina e controllare l'output di seguito -

enter image description here

+0

Puoi darmi la stringa Json che il tuo script genera? – Marcus

+1

'{" tID ": 123," Posizione ": {" locID ": 456}}' – ramiramilu

+0

@ramiramilu, qui si vincolano i valori del modulo all'oggetto javascript e quindi li si converte in json utilizzando Json.stringigy. var o = new Object(); o.tID = 123; o.Location = new Object(); o.Location.locID = 456; C'è qualche alternativa in modo che non devo legare questi valori uno per uno. Dal momento che ho una forma molto complessa e grande che consiste di grandi no di elementi generati dinamici, e ho bisogno di postarli sul controller. – Dragon

0

È possibile aggiungere [FromBody] all'interno la firma della vostra azione:

public ActionResult SomeAction([FromBody] trans trans) 
{ 

    //Access trans here 

} 
+0

Nessun effetto, la Proprietà è nullo – Marcus

1

Sei davvero vicino! La mia risposta dipende dal tuo nome del parametro del tuo modello.

permette di dire la vostra azione è la seguente

[HttpPost] 
public ActionResult Test(trans model) 
{ 

    return View(); 
} 

Allora il vostro corpo della richiesta saranno i seguenti

{ 
    "model.tID":3, 
    "model.Location":{ 
     "locID":2 
    } 
} 

Notate come il nome del parametro corrisponde a quello delle chiavi JSON.

Spero che questo aiuti!

+0

ho testato la tua soluzione e rinominare la chiave JSON "Posizione" in "trans.Location" ma non c'è alcun cambiamento nella sessione di debug – Marcus

+0

La mia risposta è sicuramente corretta in quanto l'ho persino testata in un'app campione. Hai solo bisogno di cambiare il "modello" per riflettere il nome del tuo argomento. Se non capisci cosa significa allora dammi il tuo codice di azione e aggiornerò la mia risposta per rispecchiarlo. – heymega

-1

Da this post, è necessario utilizzare json2.js per serializzare l'oggetto JSON

var json = JSON.stringify({'trans':{...}}); 

    $.ajax({ 
     url: '/api/trans', 
     type: 'POST', 
     dataType: 'json', 
     data: json, 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      $("#target").html(data); 
     } 
    }); 

Se questo non è adatto per voi, è possibile utilizzare il menu dietetici $.toDictionnary plug-in per submiting JSON oggetti collezioni.

var trans={'trans':{...}};//trans 
    $.ajax({ 
     url: "api/trans", 
     type: "POST", 
     data: $.toDictionary(trans), 
     ... 
     }); 
+0

Non ho idea di come questo aiuti a risolvere il mio problema, puoi darmi un altro suggerimento? – Marcus

0

risolto. Invia la stringa Worng Json.

Il JSON corretta è:

Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Host: localhost:53214 
Content-Length: 144 

{ 
    "Location": { 
     "locID": 2 
    } 
} 

Paragoni prego con il JSON dalla mia interrogazione. Come vedi, non è necessario descrivere il modello "trans" nel JSON. Avvia il tuo oggetto JSON dal contenuto del modello o un lavoro di deserialzer.

Cordiali saluti, Marcus Grazie ramiramilu la tua stringa JSON mi dà il suggerimento.

Problemi correlati