Как получить динамически созданный набор данных Json в контроллере MVC 3?

Хорошо, поэтому я использую MVC 3, и это отлично подходит для де-сериализации набора данных JSON в строго типизированный объект, который передается моему действию контроллера. К сожалению, я не нашел решения для более динамичного случая.

Поддерживается ли встроенная в Json де-сериализация и классы для набора свойств "undefined"? Например, скажем, у меня есть некоторые фиксированные данные, такие как имя и возраст, но я также хочу передать динамически созданный список рейтингов, в которых пользователь мог бы ввести (или выбрать) фильм и установить рейтинговое значение в таблице.

Структура данных модели может быть примерно такой:

public class UserRatings
{
  public string Name { get; set; }
  public int Age { get; set; }
  public Dictionary<string,int> Ratings { get; set; }
}

Но если предположить, что мой набор данных Json выглядит так: javascript:

var data = { Name: name, Age: age, Ratings: rating };

Если рейтинговая переменная представляет собой динамически построенный объект, состоящий из имени (или идентификатора) фильма в качестве ключа и рейтинга как числа. Естественно, де-сериализация этого в действии контроллера не будет успешной, поскольку он не понимает сопоставление рейтингов с довольно сложным словарным объектом. Но есть ли общая коллекция Json, которую я мог бы использовать вместо Ratings в качестве промежуточного формата?

Я попытался сделать объект Ratings строкой Json в javascript и просто отправить строку вниз, но я не могу найти "factory" или что-то, что может сделать структуру Json на С#, которую я могу перебрать на получить данные. Классы Json и JsonResult не помогают мне в этом отношении. В основном, как я могу использовать встроенную поддержку Json в MVC, чтобы выполнить собственную де-сериализацию в какой-то общий объект коллекции Json?

Ответ 3

Есть еще один вариант, который я предпочитаю использовать для того, чтобы быть опрятным... (мы исключаем шаг получения данных из потока запросов)

Здесь пример кода

Cat catObj = new Cat();

if (TryUpdateModel<Cat>(catObj))
{
//do stuff
}
else
{
//invalid input
}

TryUpdateModel находится в пространстве имен контроллера и, следовательно, нет необходимости добавлять дополнительную ссылку.

Если вам просто нужен Json, отправленный как часть запроса, вы можете получить его, используя следующий блок кода (вы также можете получить его из Request.Form)

using (StreamReader reader = new StreamReader(Request.InputStream))
{
    var inputJson = reader.ReadToEnd();
}