如何在MVC 3控制器中获取动态创建的Json数据集?

时间:2011-03-29 13:19:48

标签: c# javascript asp.net-mvc json

好的,所以我使用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 };

评级变量是动态构造的对象,其中包含电影的名称(或id)作为键,评级为数字。在控制器动作中自然地对其进行反序列化将不会成功,因为它不理解评级到相当复杂的字典对象的映射。但是有一个通用的Json集合,我可以使用它作为中间格式吗?

我已经尝试在javascript中将Ratings对象设为Json字符串,只是发送一个字符串,但我无法找到一个“工厂”或者可以在C#中创建Json结构的东西,我可以迭代来获取数据输出。看来,课程JsonJsonResult在这方面并没有帮助我。基本上我如何在MVC中使用内置的Json支持来将我自己的反序列化转换为一些通用的Json集合对象?

3 个答案:

答案 0 :(得分:4)

您可以对某些ActionFilters使用JavaScriptSerializerDataContractSerializer。他们非常灵活

答案 1 :(得分:1)

基本上使用动态类型查看我的回答Passing dynamic json object to C# MVC controller,而ValueProviderFactory是将Json反序列化为更动态的最简洁方法。

答案 2 :(得分:0)

还有另一种选择,我更喜欢使用它来整理...(我们取消了从请求流中获取数据的步骤)

这是一个代码示例

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();
}