Передача динамического json-объекта на controller C # MVC

Я делаю некоторую работу с .Net 4, MVC 3 и jQuery v1.5

У меня есть объект JSON, который может меняться в зависимости от того, какая страница его вызывает. Я хотел бы передать объект controllerу.

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

Я понимаю, что если я создаю пользовательскую модель, такую ​​как

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

и использовать это в моем controllerе, таком как

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

и передать объект с помощью метода .ajax jQuery следующим образом:

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

Это отлично работает, мой объект JSON сопоставляется с моим объектом C #. То, что я хотел бы сделать, это передать объект JSON, который может измениться. Когда он изменяется, я не хочу добавлять элементы в свою модель C # каждый раз, когда изменяется объект JSON.

Возможно ли это? Я попытался сопоставить объекты с Словарем, но значение данных просто закончилось бы нулевым.

благодаря

Предположительно, действие, принимающее ввод, используется только для этой конкретной цели, поэтому вы можете просто использовать объект FormCollection а затем все ваши json-свойства вашего объекта будут добавлены в коллекцию строк.

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

Вы можете отправить JSON и проанализировать его как динамическое, если вы используете обертку следующим образом:

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 #, действие controllerа:

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

Раздражать, чтобы добавить обертку на стороне JS, но просто и чисто, если вы можете пройти мимо нее.

Обновить

Вы должны также переключиться на Json.Net в качестве парсера JSON по умолчанию, чтобы это работало; в MVC4 по какой-либо причине они заменили почти все с помощью Json.Net, за исключением сериализации и десериализации controllerа.

Это не очень сложно – следуйте этой статье: http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved-jsonvalueproviderfactory-using-json-net /

Используя пользовательский ModelBinder, вы можете получить JsonValue в качестве параметра действия. Это в основном даст вам динамически типизированный объект JSON, который может быть создан на клиенте с любой формой, какой вы хотите. Этот метод описан в этом сообщении в блоге.

Другим решением является использование динамического типа в вашей модели. Я написал сообщение в блоге о том, как привязываться к динамическим типам с помощью ValueProviderFactory http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved -jsonvalueproviderfactory-используя-JSON-нетто /

  • Как читать userData в jqgrid?
  • Как заставить ASP.NET Web API возвращать JSON вместо XML с помощью Chrome?
  • Ошибка Android JSon «Ожидается BEGIN_OBJECT, но BEGIN_ARRAY в строке 1 столбца 2»
  • Как обрабатывать json, который возвращает как строку, так и строковый массив?
  • Как переименовать ключ JSON
  • Как передать данные json POST в метод Web API как объект?
  • Разбор JSON с использованием C
  • Может ли JSON начать с "["?
  • Основное использование JSONPath в Java
  • Получение ServiceStack для сохранения информации о типе
  • Почему microsoft сделал JavaScriptSerializer устаревшим до .net 3.5 SP1 и снова активным после этого?
  • Давайте будем гением компьютера.