2011-12-31 7 views
9

Por lo tanto, prácticamente todo está en el título. Básicamente, quiero enviar un JSON a través de JQuery del cliente a asp.net MVC. Me pregunto si es posible que reciba (pero no necesariamente analizar) cualquier JSON Deseo enviar desde JQuery llamada Ajax, independientemente de su tipo ... sin que yo tenga una representación concreta de tipo/modelo de la misma. (básicamente como un tipo dinámico?)¿Es posible que un "Método de acción" asp.net MVC reciba JSON sin declarar su tipo específico en el parámetro? ¿Si es así, cómo?

Hacer esto de la manera habitual (conmigo declarando el argumento de paso como tipo Objeto) simplemente produce nulos, que era lo que esperaba.

Básicamente, quiero hacer una especie de "reflexión para JSON" cosas de tipo cuando lo reciba, y ser capaz de obtener sus propiedades a través de algún tipo de bucle foreach y etc

Gracias de antemano. ¡Cualquier ayuda sería genial!

+0

¿qué tal recibir un objeto? alternativamente, no puede tener parámetros e inspeccionar la solicitud ... – jcolebrand

+0

¿quiere decir un objeto JSON? ¿cómo vas a hacer eso? Básicamente, mi objetivo es ver cómo MVC analizará el objeto JSON que estoy enviando, y ser capaz de obtener dinámicamente sus propiedades y valores a través de un ciclo foreach o algo sin un tipo concreto de C# para él. –

+0

no me refiero a 'public ActionResult Index (cosa de objeto) {' recibir un objeto. – jcolebrand

Respuesta

10

Puede usar un IDictionary<string, object> como argumento de acción. Sólo tiene que escribir un ligante modelo personalizado que va a analizar una solicitud JSON en él:

public class DictionaryModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
     { 
      return null; 
     } 

     controllerContext.HttpContext.Request.InputStream.Position = 0; 
     using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream)) 
     { 
      var json = reader.ReadToEnd(); 
      if (string.IsNullOrEmpty(json)) 
      { 
       return null; 
      } 
      return new JavaScriptSerializer().DeserializeObject(json); 
     } 
    } 
} 

que será registrada en Application_Start:

ModelBinders.Binders.Add(typeof(IDictionary<string, object>), new DictionaryModelBinder()); 

entonces usted podría tener la siguiente acción del controlador:

[HttpPost] 
public ActionResult Foo(IDictionary<string, object> model) 
{ 
    return Json(model); 
} 

al que puede arrojar cualquier cosa:

var model = { 
    foo: { 
     bar: [ 1, 2, 3 ], 
     baz: 'some baz value' 
    } 
}; 

$.ajax({ 
    url: '@Url.Action("foo")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(model), 
    success: function (result) { 
     // TODO: process the results from the server 
    } 
}); 
+0

que parece más complicado que lo que hice en el pasado por la misma cosa (computadora diferente, no esta) – jcolebrand

+0

@jcolebrand, ¿qué hiciste en el pasado? –

+0

@DarinDimitrov: esto es increíble. muchas cosas pasando aquí. gracias –

Cuestiones relacionadas