AJAX POST Complex JSON to MVC4 Controller

本文关键字:MVC4 Controller to JSON POST Complex AJAX | 更新日期: 2023-09-27 18:32:32

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

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

我定义了这些视图模型:

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 上的名称和说明属性已设置,但问题数组为 null。 我希望数据绑定能够解决这个问题,但我认为数据结构的树性质对它来说有点复杂。 如果我是对的,最好的解决方案是什么?

AJAX POST Complex JSON to MVC4 Controller

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的默认值)测试了这个结构,它可以工作。

正如@robert-harvey所说,你应该利用像 JSON.NET 这样的库,这些库已经可用来为你完成繁重的工作。

从 JSON.NET API 文档中提取:
如果你创建一个保存你的 json 的string json,你可以用new JsonTextReader(new StringReader(json)) <</p>

div class="answers"从中读取>我

一个类似的问题,用以下代码解决:

public class ExtendedController : Controller
{
    public T TryCreateModelFromJson<T>(string requestFormKey)
    {
        if (!this.Request.Form.AllKeys.Contains(requestFormKey))
        {
            throw new ArgumentException("Request form doesn't contain provided key.");
        }
        return
            JsonConvert.DeserializeObject<T>(
                this.Request.Form[requestFormKey]);
    }
}

和用法:

    [HttpPost]
    [ActionName("EditAjax")]
    public ActionResult EditAjaxPOST()
    {
        try
        {
            var viewModel =
                this.TryCreateModelFromJson<MyModel>(
                    "viewModel");
            this.EditFromModel(viewModel);
            return
                this.JsonResponse(
                    this.T("Model updated successfuly."),
                    true);
        }
        catch (Exception ex)
        {
            this.Logger.Error(ex, "Error while updating model.");
            return this.JsonResponse(this.T("Error"), false);
        }
    }

从 JS 调用:

function saveViewModel() {
    $.post(
        '@Url.Action("EditAjax")',
        {
            __RequestVerificationToken: '@Html.AntiForgeryTokenValueOrchard()',
            viewModel: ko.mapping.toJSON(viewModel)
        },
        function (data) {
             // response
        });
}

用于反序列化/序列化 JSON 的附加库:http://www.nuget.org/packages/Newtonsoft.Json