簡體   English   中英

AJAX POST復雜JSON到MVC4控制器

[英]AJAX POST Complex JSON to MVC4 Controller

我有一個復雜的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的默認設置)測試了此結構,並且它可以工作。

正如@ robert-harvey所說,您應該利用JSON.NET之類的庫來為您完成繁重的工作。

從JSON.NET API文檔中提取:
如果創建包含您的json的string json ,則可以使用new JsonTextReader(new StringReader(json))從中進行讀取

我有一個類似的問題,用以下代碼解決:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM