Pasar el objeto dynamic json al controlador C # MVC

Estoy trabajando con .Net 4, MVC 3 y jQuery v1.5

Tengo un objeto JSON que puede cambiar según la página que lo llame. Me gustaría pasar el objeto a un controlador.

{ id: 1, title: "Some text", category: "test" } 

Entiendo que si creo un modelo personalizado como

 [Serializable] public class myObject { public int id { get; set; } public string title { get; set; } public string category { get; set; } } 

y usar esto en mi controlador como

 public void DoSomething(myObject data) { // do something } 

y pasa el objeto usando el método .ajax de jQuery como este:

 $.ajax({ type: "POST", url: "/controller/method", myjsonobject, dataType: "json", traditional: true }); 

Esto funciona bien, mi objeto JSON está mapeado a mi objeto C #. Lo que me gustaría hacer es pasar a través de un objeto JSON que probablemente cambie. Cuando cambie, no quiero tener que agregar elementos a mi modelo C # cada vez que cambie el objeto JSON.

¿Es esto realmente posible? Intenté asignar objetos a un Diccionario, pero el valor de los datos simplemente terminaría siendo nulo.

Gracias

Es de suponer que la acción que acepta la entrada solo se utiliza para este propósito particular, por lo que podría utilizar el objeto FormCollection y, a continuación, todas sus propiedades JSON de su objeto se agregarán a la colección de cadenas.

 [HttpPost] public JsonResult JsonAction(FormCollection collection) { string id = collection["id"]; return this.Json(null); } 

Puede enviar JSON y analizarlo como dynamic si usa un contenedor de ese modo:

JS:

 var data = // Build an object, or null, or whatever you're sending back to the server here var wrapper = { d: data }; // Wrap the object to work around MVC ModelBinder 

C #, InputModel:

 ///  /// The JsonDynamicValueProvider supports dynamic for all properties but not the /// root InputModel. /// /// Work around this with a dummy wrapper we can reuse across methods. ///  public class JsonDynamicWrapper { ///  /// Dynamic json obj will be in d. /// /// Send to server like: /// /// { d: data } ///  public dynamic d { get; set; } } 

C #, acción del controlador:

 public JsonResult Edit(JsonDynamicWrapper json) { dynamic data = json.d; // Get the actual data out of the object // Do something with it return Json(null); } 

Es molesto agregar el envoltorio en el lado JS, pero simple y limpio si puedes pasarlo.

Actualizar

También debe cambiar a Json.Net como el analizador JSON predeterminado para que esto funcione; en MVC4 por el motivo que sea, han reemplazado casi todo con Json.Net, excepto la serialización y deserialización del controlador.

No es muy difícil – siga este artículo: http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved-jsonvalueproviderfactory-using-json-net /

Con un ModelBinder personalizado, podría recibir un valor JsonValue como parámetro de acción. Esto básicamente le daría un objeto JSON de tipo dynamic que se puede crear en el cliente con la forma que desee. Esta técnica se describe en esta publicación de blog.

Otra solución es usar un tipo dynamic en su modelo. Escribí una publicación en un blog sobre cómo enlazar a tipos dynamics usando un ValueProviderFactory http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved -jsonvalueproviderfactory-using-json-net /