Как получить динамически создаваемый набор данных Json в контроллере MVC 3? - PullRequest
2 голосов
/ 29 марта 2011

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

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

Структура данных модели может выглядеть примерно так:

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 и просто отправить строку вниз, но я не могу найти«фабрика» или что-то, что может создать структуру Json в C #, которую я могу перебрать, чтобы получить данные.Классы Json и JsonResult мне не помогают в этом плане кажется.В основном, как я могу использовать встроенную поддержку Json в MVC, чтобы выполнить собственную десериализацию в некоторый универсальный объект коллекции Json?

Ответы [ 3 ]

4 голосов
/ 29 марта 2011

Вы можете использовать JavaScriptSerializer или DataContractSerializer с некоторыми фильтрами действий. Они очень гибкие

1 голос
/ 11 января 2012

См. Мой ответ Передача динамического объекта json в контроллер C # MVC , в основном с использованием динамического типа и ValueProviderFactory - это самый чистый способ десериализации Json во что-то более динамичное.

0 голосов
/ 30 марта 2011

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

Вот пример кода

Cat catObj = new Cat();

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

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

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

using (StreamReader reader = new StreamReader(Request.InputStream))
{
    var inputJson = reader.ReadToEnd();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...