我有一个复杂的JSON对象,我想传递给MVC4控制器路由。

{
"name": "Test",
"description": "Description",
"questions": [
    {
        "id": "1",
        "type": "1",
        "text": "123",
        "answers": [
            {
                "answer": "123",
                "prerequisite": 0
            },
            {
                "answer": "123",
                "prerequisite": 0
            }
        ],
        "children": [
            {
                "id": "2",
                "type": "2",
                "text": "234",
                "answers": [
                    {
                        "answer": "234",
                        "prerequisite": 0
                    },
                    {
                        "answer": "234",
                        "prerequisite": 0
                    }
                ],
                "children": []
            }
        ]
    }
]


我定义了以下ViewModel:

public class FormDataTransformContainer
{
    public string name { get; set; }
    public string description { get; set; }
    public QuestionDataTransformContainer[] questions;
}

public class QuestionDataTransformContainer {
    public int type { get; set; }
    public string text { get; set; }
    public AnswerDataTransformContainer[] answers { get; set; }
    public QuestionDataTransformContainer[] children { get; set; }
}

public class AnswerDataTransformContainer {
    public string answer { get; set; }
    public int prerequisite { get; set; }
}


这是我要打的路线:

    [HttpPost]
    public ActionResult Create(FormDataTransformContainer formData)
    {


当前,在FormDataTransformContainer上设置了名称和description属性,但是问题数组为空。我希望数据绑定能够解决问题,但我认为数据结构的树型特性对此有些复杂。如果我正确的话,什么是最好的解决方案?

最佳答案

questions应该是属性,而不是字段。我也将从数组更改为IList<>(假设您的序列化库可以很好地处理),因为这可能更接近应有的状态,并允许您使用更通用的接口而不是特定的实现。

public class FormDataTransformContainer
{
  public string name { get; set; }
  public string description { get; set; }
  public IList<QuestionDataTransformContainer> questions { get; set; }
}

public class QuestionDataTransformContainer {
  public int type { get; set; }
  public string text { get; set; }
  public IList<AnswerDataTransformContainer> answers { get; set; }
  public IList<QuestionDataTransformContainer> children { get; set; }
}

public class AnswerDataTransformContainer {
  public string answer { get; set; }
  public int prerequisite { get; set; }
}


我已经使用Json.net(我相信MVC4的默认设置)测试了此结构,并且它可以工作。

07-24 09:50
查看更多