![](/img/trans.png)
[英]MVC4 controller post multiple json objects to controller, ajax post
[英]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.