2015-01-07 14 views
8

In MVC4, come si passa un oggetto javascript a un controller C# in AJAX? Finalmente ho provato questo ma non ha funzionato.Come passare un oggetto javascript a un controller C# MVC 4

JavaScript lato client:

var myData = {Propr1: '', Propr2: ''}; 
    $.ajax({ 
     type: 'POST', 
     data: JSON.stringify(myData), 
     url: '/Home/SubmitMyData', 
     contentType: 'application/json', 
     dataType: 'json', 
     success: alert('Youhou'), 
     error: alert('not good') 
    }); 

C# metodo lato server:

public ActionResult SubmitMyData(MyParamModel myParam) 
    { 
     // Do my stuff here with my parameter 
     return View(); 
    } 

    public class MyParamModel 
    { 
     string Prop1 { get; set; } 
     string Prop2 { get; set; } 
    } 

mio parametro è sempre nullo. Ho provato a cambiare il contentType ma non funziona ancora. Dove sono i miei errori? Ho trovato alcuni post ma non ho trovato quello che ho fatto di sbagliato.

Grazie mille.

+0

[http://msdn.microsoft.com/en-us/magazine/hh781022.aspx](model binding) sarebbe utile sapere b asics – ManirajSS

risposta

20
  1. Assicurarsi che i nomi delle proprietà corrispondano tra il javascript e il modello C#. Nella tua domanda hai avuto Propr1 e Propr2 per l'oggetto javascript, ma nel modello C# hai avuto Prop1 e Prop2 (manca la "r").
  2. Non immettere stringify prima di inviarlo e non impostare dataType su json. MVC può analizzare bene con una raccolta di parametri di post senza serializzazione json nel codice.
  3. Omettere lo contentType, non è necessario. WebAPI dovrebbe rilevare automaticamente questo. Puoi lasciarlo, ma è estraneo.
  4. Assicurarsi che le proprietà del modello siano pubbliche.

JavaScript lato client:

var myData = {Prop1: '', Prop2: ''}; // #1 
    $.ajax({ 
     type: 'POST', 
     data: myData, // #2 
     url: '/Home/SubmitMyData', 
     //contentType: 'application/json', #3 
     //dataType: 'json', #2 
     success: alert('Youhou'), 
     error: alert('not good') 
    }); 

C metodo lato # Server:

public ActionResult SubmitMyData(MyParamModel myParam) 
    { 
     // Do my stuff here with my parameter 
     return View(); 
    } 

    public class MyParamModel // #4 
    { 
     public string Prop1 { get; set; } 
     public string Prop2 { get; set; } 
    } 
+0

Puoi pubblicare una piccola spiegazione su cosa è stato sbagliato e perché il tuo codice funziona? – WindRaven

+0

Non penso che l'attributo FromBody sia appropriato qui. L'OP utilizza MVC 4, non l'API Web. –

+0

@DavidL grazie per averlo sottolineato, ho pensato che si trattasse di una domanda WebAPI dovuta al titolo. – danludwig

1

Il valore si passa per la proprietà data dovrebbe essere un oggetto, non una stringa:

data: myData, 

i nomi delle proprietà devono corrispondere:

var myData = { Prop1: '', Prop2: ''}; 

è necessario utilizzare l'attributo [FromBody] sul valore del parametro:

public ActionResult SubmitMyData([FromBody] MyParamModel myParam) 

e le proprietà del tipo di modello ha bisogno di essere public:

public class MyParamModel 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 
Problemi correlati