2012-01-30 23 views
6

Sto cercando di inviare alcuni dati JSON al mio metodo di azione del controller ASP.NET MVC3, ma non funzionerà, qualunque cosa io faccia.ASP.NET MVC invio di dati JSON a un controller Azione

Qui è la mia chiamata AJAX (che utilizza il metodo JSON.stringify dalla json2.js):

$.ajax({ 
     url: '/Home/GetData', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8;", 
     data: JSON.stringify(filters_data), 
     success: function (data) { 
      alert(data); 
     } 
    }); 

Il Fiddler mostra la richiesta in questo modo:

POST http://localhost:51492/Home/GetData HTTP/1.1 
Host: localhost:51492 
Connection: keep-alive 
Content-Length: 171 
Origin: http://localhost:51492 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko)  Chrome/16.0.912.75 Safari/535.7 
Content-Type: application/json; charset=UTF-8; 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:51492/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Filters":[{"Field":3,"Operator":0,"Values":["30.01.2012.","30.01.2012."]},{"Field":2,"Operator":0,"Values":["-1"]},{"Field":0,"Operator":0,"Values":["some-string"]}]} 

mio codice C#:

[HttpPost] 
public string GetData(QueryFilters filters) 
{ 
    return "Ho ho ho and a bottle of rum."; 
} 

[Serializable] 
public enum Fields 
{ 
     A, 
     B, 
     C, 
     D 
} 

[Serializable] 
public enum FilterOperator 
{ 
    Is, 
    Between, 
    GreaterOrEqual, 
} 

[Serializable] 
public class QueryFilter 
{ 
    public Fields Field { get; set; } 
    public FilterOperator Operator { get; set; } 
    public List<string> Values { get; set; } 
} 

[Serializable] 
public class QueryFilters 
{ 
    public List<QueryFilter> Filters { get; set; } 
} 

Ho aggiunto la seguente riga al metodo Application_Start() di global.asax.cs:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

Il punto di interruzione nel metodo di azione 'GetData' viene colpito, ma il valore della proprietà Filters è null. Qualche idea?

Un'altra nota: ho provato a passare un oggetto molto più semplice: Person - proprietà stringa Nome e int Age, con lo stesso risultato - sembra che il binding automatico del modello non funzioni per me ma non lo so come controllarlo

risposta

5

Il problema è che il tuo argomento di azione è chiamato filters e che all'interno del tuo modello QueryFilters hai una proprietà chiamata Filters che confonde il raccoglitore modello predefinito.

Così semplicemente rinominare il tuo argomento dell'azione:

[HttpPost] 
public ActionResult GetData(QueryFilters model) 
{ 
    return Json("Ho ho ho and a bottle of rum."); 
} 

Oh, e notare che le azioni dovrebbero ritorno non ActionResults stringhe.

Rimuovere anche la seguente riga dal global.asax:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

ASP.NET MVC 3 ha già questa built-in.

O se assolutamente per qualche motivo bisogno di avere il vostro argomento dell'azione chiamato filters allora si potrebbe anche modificare la richiesta JSON si sta inviando a questo:

data: JSON.stringify({ 
    filters: { 
     Filters: [ 
      { "Field": 3, "Operator": 0, "Values": ["30.01.2012.", "30.01.2012."] }, 
      { "Field": 2, "Operator": 0, "Values": ["-1"] }, 
      { "Field": 0, "Operator": 0, "Values": ["some-string"] } 
     ] 
    } 
}), 

Ora non c'è più ambiguità.

+0

+1 Ben individuato. Non sono riuscito a trovare la cosa a cui ho fatto riferimento nella mia risposta, quindi l'ho cancellata ... –

+0

Grazie mille! Non riesco a spiegare quanto sono stato frustrato, ho provato un miliardo di cose diverse e si è rivelato un semplice problema di denominazione. – skali

+0

Impressionante fino in fondo, ho guardato molto lontano per questo, ma ovviamente è in pila! –

Problemi correlati