2012-01-30 28 views
6

Estoy tratando de enviar algunos datos JSON a mi método de acción de controlador ASP.NET MVC3, pero no funcionará sin importar lo que haga.ASP.NET MVC enviando datos JSON a una acción de controlador

Aquí es mi llamada Ajax (que utiliza el método de la JSON.stringify 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); 
     } 
    }); 

El violinista muestra la solicitud de la siguiente manera:

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"]}]} 

Mi código 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; } 
} 

He agregado la siguiente línea al método Application_Start() de global.asax.cs:

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

El punto de interrupción en el método de acción 'GetData' es golpeado, pero el valor de la propiedad filtros es nula. ¿Algunas ideas?

Otra nota: He intentado pasar un objeto mucho más simple: persona - propiedades cadena Nombre y edad int, con el mismo resultado - parece que el encuadernado automático no funciona para mí, pero no sé cómo verificarlo

Respuesta

5

El problema es que su argumento de acción se llama filters y que dentro de su modelo QueryFilters tiene una propiedad llamada Filters que confunde el archivador de modelo predeterminado.

Así que simplemente cambiar el nombre del argumento de la acción:

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

Ah, y observe que las acciones deben volver no ActionResults cuerdas.

También quite la línea siguiente de su global.asax:

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

ASP.NET MVC 3 ya tiene esta incorporado.

O si a pesar de todo por alguna razón necesita tener su argumento de acción llamada filters entonces también podría modificar la solicitud JSON que está enviando a esto:

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"] } 
     ] 
    } 
}), 

Ahora ya no hay ambigüedad.

+0

+1 Bien manchado. No pude encontrar lo que mencioné en mi respuesta, así que lo he borrado ... –

+0

¡Muchas gracias! No puedo explicar lo frustrado que me sentí, probé mil millones de cosas diferentes y resultó ser un simple problema de nomenclatura. – skali

+0

Impresionante durante todo el camino, he estado buscando algo de cerca, pero por supuesto, ¡está en la pila! –

Cuestiones relacionadas